lcd handler for weather predictor
Dependencies: C12832_lcd LCD_fonts
Diff: GraphicHandler.cpp
- Revision:
- 1:4399eaceb999
- Parent:
- 0:896ba7a737d9
- Child:
- 2:459f757bd2f4
--- a/GraphicHandler.cpp Wed Jan 28 15:21:34 2015 +0000 +++ b/GraphicHandler.cpp Wed Jan 28 15:52:09 2015 +0000 @@ -7,27 +7,27 @@ this->data_dimension = data_dimension; this->seq_time_interval = seq_time_interval; this->predict_length = predict_length; - + // アロケート now_data = new float[data_dimension]; predict_data = new float[data_dimension * predict_length]; predict_weather = new int[predict_length]; - + // ティッカー初期化 time_ticker.attach(this, &GraphicHandler::update_time, 60.0); image_ticker.attach(this, &GraphicHandler::update_image, 1.0); - + // ジョイスティック割り込み設定 : p13が左, p16が右 joy_left = new InterruptIn(p13); joy_right = new InterruptIn(p16); joy_left->rise(this, &GraphicHandler::joyleft_isr); joy_right->rise(this, &GraphicHandler::joyright_isr); - + // LCDの初期化/フォントサイズ設定 lcd.cls(); // lcd.setmode(XOR); // lcd.set_font((unsigned char*) Arial_9); - + // 画面番号のリセット current_display_no = 0; current_image_no = 0; @@ -35,9 +35,11 @@ GraphicHandler::~GraphicHandler(void) { - delete [] now_data; delete [] predict_data; - delete [] predict_weather; - delete joy_left; delete joy_right; + delete [] now_data; + delete [] predict_data; + delete [] predict_weather; + delete joy_left; + delete joy_right; } // 予測データと天気のセット @@ -48,23 +50,23 @@ } // 観測データのセット -void GraphicHandler::set_now_data(float* now_data) +void GraphicHandler::set_now_data(float* now_data) { memcpy(this->now_data, now_data, sizeof(float) * data_dimension); } // ジョイスティック左 -void GraphicHandler::joyleft_isr(void) +void GraphicHandler::joyleft_isr(void) { current_display_no++; update_draw(); printf("JOYSTICK LEFT FIRED DISP_NO:%d \r\n", current_display_no); - -} + +} // ジョイスティック右 -void GraphicHandler::joyright_isr(void) +void GraphicHandler::joyright_isr(void) { current_display_no--; update_draw(); @@ -75,7 +77,13 @@ void GraphicHandler::update_time(void) { now_time = time(NULL) + (60 * 60 * 9); // JSTにコンバートして取得 -} +} + +// 最終学習時刻の更新 +void GraphicHandler::update_last_learned_time(void) +{ + last_learned_time = now_time; +} // 画像番号の更新 void GraphicHandler::update_image(void) @@ -85,26 +93,29 @@ current_image_no = 0; } } - + // 描画処理 void GraphicHandler::update_draw(void) { lcd.cls(); // 画面クリア/locateの座標を原点に lcd.setmode(XOR); // 描写モードをXORに : 重ねて書くと消える - + // 現在の画面番号の調整 if (current_display_no < 0) { current_display_no = 0; } else if (current_display_no > predict_length) { current_display_no = predict_length; } - + // 現在/予測データの描写 配置は全部決め打ち(すまんな) if (current_display_no == 0) { draw_text_at("Now", (unsigned char *)Arial_9, 0, 0); + // データ draw_data_at(now_data[0], "C", (unsigned char *)Small_7, 37, 4); draw_data_at(now_data[1], "%%", (unsigned char *)Small_7, 37, 12); draw_data_at(now_data[2], "hPa", (unsigned char *)Small_7, 37, 20); + // 時刻 + draw_time_at((unsigned char *)Arial_9, 0, 5, 10); } else { // 画面番号に合わせて予測系列インデックスを変化させる int base_index = data_dimension * (current_display_no-1); @@ -114,10 +125,11 @@ draw_data_at(predict_data[base_index + 2], "hPa", (unsigned char *)Small_7, 37, 20); draw_weather_bitmap_at(predict_weather[current_display_no-1], current_image_no, 87, 2); // draw_percentage_at(0.5, (unsigned char *)Small_6, 112, 25); + // 予測時刻 + draw_time_at((unsigned char *)Arial_9, seq_time_interval * current_display_no, 5, 10); } - - // 時間 - draw_time_at((unsigned char *)Arial_9, seq_time_interval * current_display_no, 5, 10); + + } @@ -161,67 +173,73 @@ strcat(buffer, "%%"); } draw_text_at(buffer, format, x, y); - return; + return; } // 時刻の描画ルーチン -void GraphicHandler::draw_time_at(unsigned char* format, +void GraphicHandler::draw_time_at(unsigned char* format, int elapsed_time, int x, int y) { char buffer[20]; - time_t buf_time = now_time + elapsed_time * 60; + time_t buf_time; + // 経過時間が指定された場合は予測時刻であることがわかる + if (elapsed_time > 0) { + buf_time = last_learned_time + elapsed_time * 60; + } else if (elapsed_time == 0) { + buf_time = now_time; + } else { + buf_time = time(NULL); + } strftime(buffer, 32, "%H:%M", localtime(&buf_time)); draw_text_at(buffer, format, x, y); return; } // 天候の描画ルーチン -void GraphicHandler::draw_weather_bitmap_at(int weather_id, - int image_no, - int x, int y) -{ - Bitmap buffer; + void GraphicHandler::draw_weather_bitmap_at(int weather_id, + int image_no, + int x, int y) { + Bitmap buffer; - // lcd.setmode(XOR); - // ビットマップ選択 - switch(weather_id) { - case SHINY: - // 番号についても場合分けだよ! - if (image_no == 0) { - buffer = bitm_shiny1; - } else if (image_no == 1) { - buffer = bitm_shiny2; - } - break; - case CLOUDY: - if (image_no == 0) { - buffer = bitm_cloudy1; - } else if (image_no == 1) { - buffer = bitm_cloudy2; - } - break; - case RAINY: - if (image_no == 0) { - buffer = bitm_rainy1; - } else if (image_no == 1) { - buffer = bitm_rainy2; - } - break; - case SNOWY: - if (image_no == 0) { - buffer = bitm_snowy1; - } else if (image_no == 1) { - buffer = bitm_snowy2; - } - break; - default: - fprintf(stderr, "ERROR : weather drawing \r\n"); - break; + // lcd.setmode(XOR); + // ビットマップ選択 + switch(weather_id) { + case SHINY: + // 番号についても場合分けだよ! + if (image_no == 0) { + buffer = bitm_shiny1; + } else if (image_no == 1) { + buffer = bitm_shiny2; + } + break; + case CLOUDY: + if (image_no == 0) { + buffer = bitm_cloudy1; + } else if (image_no == 1) { + buffer = bitm_cloudy2; + } + break; + case RAINY: + if (image_no == 0) { + buffer = bitm_rainy1; + } else if (image_no == 1) { + buffer = bitm_rainy2; + } + break; + case SNOWY: + if (image_no == 0) { + buffer = bitm_snowy1; + } else if (image_no == 1) { + buffer = bitm_snowy2; + } + break; + default: + fprintf(stderr, "ERROR : weather drawing \r\n"); + break; + } + // 描画 + lcd.print_bm(buffer, x, y); + lcd.copy_to_lcd(); + return; } - // 描画 - lcd.print_bm(buffer, x, y); - lcd.copy_to_lcd(); - return; -} - \ No newline at end of file