lcd handler for weather predictor

Dependencies:   C12832_lcd LCD_fonts

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?

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