lcd handler for weather predictor

Dependencies:   C12832_lcd LCD_fonts

Committer:
yukari_hinata
Date:
Thu Feb 19 13:52:57 2015 +0000
Revision:
5:4aacf35455da
Parent:
4:1d811ee32310
reviced

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yukari_hinata 0:896ba7a737d9 1 #include "GraphicHandler.hpp"
yukari_hinata 0:896ba7a737d9 2 #include "graphics.hpp"
yukari_hinata 0:896ba7a737d9 3
yukari_hinata 0:896ba7a737d9 4 // コンストラクタ
yukari_hinata 3:3569342a4ab0 5 GraphicHandler::GraphicHandler(int data_dimension, int seq_time_interval, int predict_length, time_t init_time)
yukari_hinata 0:896ba7a737d9 6 {
yukari_hinata 3:3569342a4ab0 7 this->data_dimension = data_dimension;
yukari_hinata 3:3569342a4ab0 8 this->seq_time_interval = seq_time_interval;
yukari_hinata 3:3569342a4ab0 9 this->predict_length = predict_length;
yukari_hinata 3:3569342a4ab0 10 this->now_time = init_time;
yukari_hinata 1:4399eaceb999 11
yukari_hinata 0:896ba7a737d9 12 // アロケート
yukari_hinata 0:896ba7a737d9 13 now_data = new float[data_dimension];
yukari_hinata 0:896ba7a737d9 14 predict_data = new float[data_dimension * predict_length];
yukari_hinata 0:896ba7a737d9 15 predict_weather = new int[predict_length];
yukari_hinata 2:459f757bd2f4 16 predict_probability = new float[predict_length];
yukari_hinata 1:4399eaceb999 17
yukari_hinata 0:896ba7a737d9 18 // ティッカー初期化
yukari_hinata 3:3569342a4ab0 19 // time_ticker.attach(this, &GraphicHandler::update_time, 60.0);
yukari_hinata 3:3569342a4ab0 20 // image_ticker.attach(this, &GraphicHandler::update_image, 1.0);
yukari_hinata 1:4399eaceb999 21
yukari_hinata 0:896ba7a737d9 22 // ジョイスティック割り込み設定 : p13が左, p16が右
yukari_hinata 0:896ba7a737d9 23 joy_left = new InterruptIn(p13);
yukari_hinata 0:896ba7a737d9 24 joy_right = new InterruptIn(p16);
yukari_hinata 0:896ba7a737d9 25 joy_left->rise(this, &GraphicHandler::joyleft_isr);
yukari_hinata 0:896ba7a737d9 26 joy_right->rise(this, &GraphicHandler::joyright_isr);
yukari_hinata 1:4399eaceb999 27
yukari_hinata 0:896ba7a737d9 28 // LCDの初期化/フォントサイズ設定
yukari_hinata 0:896ba7a737d9 29 lcd.cls();
yukari_hinata 0:896ba7a737d9 30 // lcd.setmode(XOR);
yukari_hinata 0:896ba7a737d9 31 // lcd.set_font((unsigned char*) Arial_9);
yukari_hinata 1:4399eaceb999 32
yukari_hinata 0:896ba7a737d9 33 // 画面番号のリセット
yukari_hinata 0:896ba7a737d9 34 current_display_no = 0;
yukari_hinata 0:896ba7a737d9 35 current_image_no = 0;
yukari_hinata 0:896ba7a737d9 36 }
yukari_hinata 0:896ba7a737d9 37
yukari_hinata 0:896ba7a737d9 38 GraphicHandler::~GraphicHandler(void)
yukari_hinata 0:896ba7a737d9 39 {
yukari_hinata 1:4399eaceb999 40 delete [] now_data;
yukari_hinata 1:4399eaceb999 41 delete [] predict_data;
yukari_hinata 2:459f757bd2f4 42 delete [] predict_probability;
yukari_hinata 1:4399eaceb999 43 delete [] predict_weather;
yukari_hinata 1:4399eaceb999 44 delete joy_left;
yukari_hinata 1:4399eaceb999 45 delete joy_right;
yukari_hinata 0:896ba7a737d9 46 }
yukari_hinata 0:896ba7a737d9 47
yukari_hinata 0:896ba7a737d9 48 // 予測データと天気のセット
yukari_hinata 2:459f757bd2f4 49 void GraphicHandler::set_predict_data(float* predict_data, int* predict_weather, float* predict_probability)
yukari_hinata 0:896ba7a737d9 50 {
yukari_hinata 0:896ba7a737d9 51 memcpy(this->predict_data, predict_data, sizeof(float) * data_dimension * predict_length);
yukari_hinata 0:896ba7a737d9 52 memcpy(this->predict_weather, predict_weather, sizeof(int) * predict_length);
yukari_hinata 2:459f757bd2f4 53 memcpy(this->predict_probability, predict_probability, sizeof(float) * predict_length);
yukari_hinata 0:896ba7a737d9 54 }
yukari_hinata 0:896ba7a737d9 55
yukari_hinata 0:896ba7a737d9 56 // 観測データのセット
yukari_hinata 1:4399eaceb999 57 void GraphicHandler::set_now_data(float* now_data)
yukari_hinata 0:896ba7a737d9 58 {
yukari_hinata 0:896ba7a737d9 59 memcpy(this->now_data, now_data, sizeof(float) * data_dimension);
yukari_hinata 0:896ba7a737d9 60 }
yukari_hinata 0:896ba7a737d9 61
yukari_hinata 0:896ba7a737d9 62
yukari_hinata 0:896ba7a737d9 63 // ジョイスティック左
yukari_hinata 1:4399eaceb999 64 void GraphicHandler::joyleft_isr(void)
yukari_hinata 0:896ba7a737d9 65 {
yukari_hinata 0:896ba7a737d9 66 current_display_no++;
yukari_hinata 3:3569342a4ab0 67 //update_draw();
yukari_hinata 3:3569342a4ab0 68 //printf("JOYSTICK LEFT FIRED DISP_NO:%d \r\n", current_display_no);
yukari_hinata 1:4399eaceb999 69
yukari_hinata 1:4399eaceb999 70 }
yukari_hinata 0:896ba7a737d9 71
yukari_hinata 0:896ba7a737d9 72 // ジョイスティック右
yukari_hinata 1:4399eaceb999 73 void GraphicHandler::joyright_isr(void)
yukari_hinata 0:896ba7a737d9 74 {
yukari_hinata 0:896ba7a737d9 75 current_display_no--;
yukari_hinata 3:3569342a4ab0 76 //update_draw();
yukari_hinata 3:3569342a4ab0 77 //printf("JOYSTICK RIGHT FIRED DISP_NO:%d \r\n", current_display_no);
yukari_hinata 0:896ba7a737d9 78 }
yukari_hinata 0:896ba7a737d9 79
yukari_hinata 0:896ba7a737d9 80 // 時間の更新
yukari_hinata 0:896ba7a737d9 81 void GraphicHandler::update_time(void)
yukari_hinata 0:896ba7a737d9 82 {
yukari_hinata 5:4aacf35455da 83 now_time = time(NULL);
yukari_hinata 1:4399eaceb999 84 }
yukari_hinata 1:4399eaceb999 85
yukari_hinata 1:4399eaceb999 86 // 最終学習時刻の更新
yukari_hinata 1:4399eaceb999 87 void GraphicHandler::update_last_learned_time(void)
yukari_hinata 1:4399eaceb999 88 {
yukari_hinata 1:4399eaceb999 89 last_learned_time = now_time;
yukari_hinata 1:4399eaceb999 90 }
yukari_hinata 0:896ba7a737d9 91
yukari_hinata 0:896ba7a737d9 92 // 画像番号の更新
yukari_hinata 0:896ba7a737d9 93 void GraphicHandler::update_image(void)
yukari_hinata 0:896ba7a737d9 94 {
yukari_hinata 0:896ba7a737d9 95 current_image_no++;
yukari_hinata 0:896ba7a737d9 96 if (current_image_no >= 2) {
yukari_hinata 0:896ba7a737d9 97 current_image_no = 0;
yukari_hinata 0:896ba7a737d9 98 }
yukari_hinata 0:896ba7a737d9 99 }
yukari_hinata 1:4399eaceb999 100
yukari_hinata 0:896ba7a737d9 101 // 描画処理
yukari_hinata 0:896ba7a737d9 102 void GraphicHandler::update_draw(void)
yukari_hinata 0:896ba7a737d9 103 {
yukari_hinata 0:896ba7a737d9 104 lcd.cls(); // 画面クリア/locateの座標を原点に
yukari_hinata 0:896ba7a737d9 105 lcd.setmode(XOR); // 描写モードをXORに : 重ねて書くと消える
yukari_hinata 1:4399eaceb999 106
yukari_hinata 0:896ba7a737d9 107 // 現在の画面番号の調整
yukari_hinata 0:896ba7a737d9 108 if (current_display_no < 0) {
yukari_hinata 0:896ba7a737d9 109 current_display_no = 0;
yukari_hinata 0:896ba7a737d9 110 } else if (current_display_no > predict_length) {
yukari_hinata 0:896ba7a737d9 111 current_display_no = predict_length;
yukari_hinata 0:896ba7a737d9 112 }
yukari_hinata 1:4399eaceb999 113
yukari_hinata 0:896ba7a737d9 114 // 現在/予測データの描写 配置は全部決め打ち(すまんな)
yukari_hinata 0:896ba7a737d9 115 if (current_display_no == 0) {
yukari_hinata 0:896ba7a737d9 116 draw_text_at("Now", (unsigned char *)Arial_9, 0, 0);
yukari_hinata 1:4399eaceb999 117 // データ
yukari_hinata 0:896ba7a737d9 118 draw_data_at(now_data[0], "C", (unsigned char *)Small_7, 37, 4);
yukari_hinata 3:3569342a4ab0 119 draw_data_at(now_data[1], "hPa", (unsigned char *)Small_7, 37, 12);
yukari_hinata 3:3569342a4ab0 120 draw_data_at(now_data[2], "%%", (unsigned char *)Small_7, 37, 20);
yukari_hinata 1:4399eaceb999 121 // 時刻
yukari_hinata 1:4399eaceb999 122 draw_time_at((unsigned char *)Arial_9, 0, 5, 10);
yukari_hinata 0:896ba7a737d9 123 } else {
yukari_hinata 0:896ba7a737d9 124 // 画面番号に合わせて予測系列インデックスを変化させる
yukari_hinata 0:896ba7a737d9 125 int base_index = data_dimension * (current_display_no-1);
yukari_hinata 0:896ba7a737d9 126 draw_text_at("Predict", (unsigned char *)Arial_9, 0, 0);
yukari_hinata 0:896ba7a737d9 127 draw_data_at(predict_data[base_index], "C", (unsigned char *)Small_7, 37, 4);
yukari_hinata 3:3569342a4ab0 128 draw_data_at(predict_data[base_index + 1], "hPa", (unsigned char *)Small_7, 37, 12);
yukari_hinata 3:3569342a4ab0 129 draw_data_at(predict_data[base_index + 2], "%%", (unsigned char *)Small_7, 37, 20);
yukari_hinata 0:896ba7a737d9 130 draw_weather_bitmap_at(predict_weather[current_display_no-1], current_image_no, 87, 2);
yukari_hinata 2:459f757bd2f4 131 draw_percentage_at(predict_probability[current_display_no-1], (unsigned char *)Small_6, 112, 25);
yukari_hinata 1:4399eaceb999 132 // 予測時刻
yukari_hinata 1:4399eaceb999 133 draw_time_at((unsigned char *)Arial_9, seq_time_interval * current_display_no, 5, 10);
yukari_hinata 0:896ba7a737d9 134 }
yukari_hinata 1:4399eaceb999 135
yukari_hinata 0:896ba7a737d9 136 }
yukari_hinata 0:896ba7a737d9 137
yukari_hinata 0:896ba7a737d9 138 // テキストの描画ルーチン
yukari_hinata 0:896ba7a737d9 139 void GraphicHandler::draw_text_at(const char* str,
yukari_hinata 0:896ba7a737d9 140 unsigned char* format,
yukari_hinata 0:896ba7a737d9 141 int x, int y)
yukari_hinata 0:896ba7a737d9 142 {
yukari_hinata 0:896ba7a737d9 143 // lcd.setmode(XOR);
yukari_hinata 0:896ba7a737d9 144 lcd.set_font(format);
yukari_hinata 0:896ba7a737d9 145 lcd.locate(x, y);
yukari_hinata 0:896ba7a737d9 146 lcd.printf(str);
yukari_hinata 0:896ba7a737d9 147 return;
yukari_hinata 0:896ba7a737d9 148 }
yukari_hinata 0:896ba7a737d9 149
yukari_hinata 4:1d811ee32310 150 // ログ出力
yukari_hinata 4:1d811ee32310 151 void GraphicHandler::draw_log(const char* msg)
yukari_hinata 4:1d811ee32310 152 {
yukari_hinata 5:4aacf35455da 153 lcd.cls();
yukari_hinata 4:1d811ee32310 154 draw_text_at(msg, (unsigned char *)Small_6, 0, 25);
yukari_hinata 4:1d811ee32310 155 }
yukari_hinata 4:1d811ee32310 156
yukari_hinata 0:896ba7a737d9 157 // データの描画ルーチン
yukari_hinata 0:896ba7a737d9 158 void GraphicHandler::draw_data_at(float data,
yukari_hinata 0:896ba7a737d9 159 const char* unit,
yukari_hinata 0:896ba7a737d9 160 unsigned char* format,
yukari_hinata 0:896ba7a737d9 161 int x, int y)
yukari_hinata 0:896ba7a737d9 162 {
yukari_hinata 0:896ba7a737d9 163 // 実質sprintf
yukari_hinata 0:896ba7a737d9 164 char buffer[20];
yukari_hinata 0:896ba7a737d9 165 sprintf(buffer, "%5.1f %s", data, unit); // 全体5桁, 小数点一位まで.
yukari_hinata 0:896ba7a737d9 166 draw_text_at(buffer, format, x, y);
yukari_hinata 0:896ba7a737d9 167 return;
yukari_hinata 0:896ba7a737d9 168 }
yukari_hinata 0:896ba7a737d9 169
yukari_hinata 0:896ba7a737d9 170 // 確率の描画
yukari_hinata 0:896ba7a737d9 171 void GraphicHandler::draw_percentage_at(float percentage,
yukari_hinata 0:896ba7a737d9 172 unsigned char* format,
yukari_hinata 0:896ba7a737d9 173 int x, int y)
yukari_hinata 0:896ba7a737d9 174 {
yukari_hinata 0:896ba7a737d9 175 char buffer[20];
yukari_hinata 0:896ba7a737d9 176 int convert_per_val = int(percentage * 100);
yukari_hinata 0:896ba7a737d9 177 // 確率100%の時は'%'を印字しない
yukari_hinata 0:896ba7a737d9 178 if ( convert_per_val >= 100 ) {
yukari_hinata 0:896ba7a737d9 179 strcat(buffer, "100");
yukari_hinata 0:896ba7a737d9 180 } else {
yukari_hinata 0:896ba7a737d9 181 sprintf(buffer, "%d", convert_per_val);
yukari_hinata 0:896ba7a737d9 182 strcat(buffer, "%%");
yukari_hinata 0:896ba7a737d9 183 }
yukari_hinata 0:896ba7a737d9 184 draw_text_at(buffer, format, x, y);
yukari_hinata 1:4399eaceb999 185 return;
yukari_hinata 0:896ba7a737d9 186 }
yukari_hinata 0:896ba7a737d9 187
yukari_hinata 0:896ba7a737d9 188 // 時刻の描画ルーチン
yukari_hinata 1:4399eaceb999 189 void GraphicHandler::draw_time_at(unsigned char* format,
yukari_hinata 0:896ba7a737d9 190 int elapsed_time,
yukari_hinata 0:896ba7a737d9 191 int x, int y)
yukari_hinata 0:896ba7a737d9 192 {
yukari_hinata 0:896ba7a737d9 193 char buffer[20];
yukari_hinata 1:4399eaceb999 194 time_t buf_time;
yukari_hinata 1:4399eaceb999 195 // 経過時間が指定された場合は予測時刻であることがわかる
yukari_hinata 1:4399eaceb999 196 if (elapsed_time > 0) {
yukari_hinata 3:3569342a4ab0 197 buf_time = last_learned_time + elapsed_time;
yukari_hinata 1:4399eaceb999 198 } else if (elapsed_time == 0) {
yukari_hinata 1:4399eaceb999 199 buf_time = now_time;
yukari_hinata 1:4399eaceb999 200 } else {
yukari_hinata 1:4399eaceb999 201 buf_time = time(NULL);
yukari_hinata 1:4399eaceb999 202 }
yukari_hinata 0:896ba7a737d9 203 strftime(buffer, 32, "%H:%M", localtime(&buf_time));
yukari_hinata 0:896ba7a737d9 204 draw_text_at(buffer, format, x, y);
yukari_hinata 0:896ba7a737d9 205 return;
yukari_hinata 0:896ba7a737d9 206 }
yukari_hinata 0:896ba7a737d9 207
yukari_hinata 0:896ba7a737d9 208 // 天候の描画ルーチン
yukari_hinata 2:459f757bd2f4 209 void GraphicHandler::draw_weather_bitmap_at(int weather_id,
yukari_hinata 2:459f757bd2f4 210 int image_no,
yukari_hinata 2:459f757bd2f4 211 int x, int y)
yukari_hinata 2:459f757bd2f4 212 {
yukari_hinata 2:459f757bd2f4 213 Bitmap buffer;
yukari_hinata 0:896ba7a737d9 214
yukari_hinata 2:459f757bd2f4 215 // lcd.setmode(XOR);
yukari_hinata 2:459f757bd2f4 216 // ビットマップ選択
yukari_hinata 2:459f757bd2f4 217 switch(weather_id) {
yukari_hinata 2:459f757bd2f4 218 case SHINY:
yukari_hinata 2:459f757bd2f4 219 // 番号についても場合分けだよ!
yukari_hinata 2:459f757bd2f4 220 if (image_no == 0) {
yukari_hinata 2:459f757bd2f4 221 buffer = bitm_shiny1;
yukari_hinata 2:459f757bd2f4 222 } else if (image_no == 1) {
yukari_hinata 2:459f757bd2f4 223 buffer = bitm_shiny2;
yukari_hinata 2:459f757bd2f4 224 }
yukari_hinata 2:459f757bd2f4 225 break;
yukari_hinata 2:459f757bd2f4 226 case CLOUDY:
yukari_hinata 2:459f757bd2f4 227 if (image_no == 0) {
yukari_hinata 2:459f757bd2f4 228 buffer = bitm_cloudy1;
yukari_hinata 2:459f757bd2f4 229 } else if (image_no == 1) {
yukari_hinata 2:459f757bd2f4 230 buffer = bitm_cloudy2;
yukari_hinata 2:459f757bd2f4 231 }
yukari_hinata 2:459f757bd2f4 232 break;
yukari_hinata 2:459f757bd2f4 233 case RAINY:
yukari_hinata 2:459f757bd2f4 234 if (image_no == 0) {
yukari_hinata 2:459f757bd2f4 235 buffer = bitm_rainy1;
yukari_hinata 2:459f757bd2f4 236 } else if (image_no == 1) {
yukari_hinata 2:459f757bd2f4 237 buffer = bitm_rainy2;
yukari_hinata 2:459f757bd2f4 238 }
yukari_hinata 2:459f757bd2f4 239 break;
yukari_hinata 2:459f757bd2f4 240 case SNOWY:
yukari_hinata 2:459f757bd2f4 241 if (image_no == 0) {
yukari_hinata 2:459f757bd2f4 242 buffer = bitm_snowy1;
yukari_hinata 2:459f757bd2f4 243 } else if (image_no == 1) {
yukari_hinata 2:459f757bd2f4 244 buffer = bitm_snowy2;
yukari_hinata 2:459f757bd2f4 245 }
yukari_hinata 2:459f757bd2f4 246 break;
yukari_hinata 2:459f757bd2f4 247 default:
yukari_hinata 2:459f757bd2f4 248 fprintf(stderr, "ERROR : weather drawing \r\n");
yukari_hinata 2:459f757bd2f4 249 break;
yukari_hinata 0:896ba7a737d9 250 }
yukari_hinata 2:459f757bd2f4 251 // 描画
yukari_hinata 2:459f757bd2f4 252 lcd.print_bm(buffer, x, y);
yukari_hinata 2:459f757bd2f4 253 lcd.copy_to_lcd();
yukari_hinata 2:459f757bd2f4 254 return;
yukari_hinata 2:459f757bd2f4 255 }