lcd handler for weather predictor

Dependencies:   C12832_lcd LCD_fonts

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?

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