lcd handler for weather predictor

Dependencies:   C12832_lcd LCD_fonts

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