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