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