lcd handler for weather predictor
Dependencies: C12832_lcd LCD_fonts
GraphicHandler.cpp@5:4aacf35455da, 2015-02-19 (annotated)
- 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?
User | Revision | Line number | New 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 | } |