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