lcd handler for weather predictor

Dependencies:   C12832_lcd LCD_fonts

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?

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 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 }