Weather casting with Machine Learning (SVM and SRNN).

Dependencies:   EthernetInterface GraphicHandler NTPClient SRNN SVM SensorModule mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
yukari_hinata
Date:
Thu Feb 19 13:53:12 2015 +0000
Parent:
3:5add3759e08a
Child:
5:b61f3f5b0fc8
Commit message:
there are 2 bugs.

Changed in this revision

GraphicHandler.lib Show annotated file Show diff for this revision Revisions of this file
SRNN.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
setup.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/GraphicHandler.lib	Thu Feb 19 08:20:46 2015 +0000
+++ b/GraphicHandler.lib	Thu Feb 19 13:53:12 2015 +0000
@@ -1,1 +1,1 @@
-GraphicHandler#1d811ee32310
+GraphicHandler#4aacf35455da
--- a/SRNN.lib	Thu Feb 19 08:20:46 2015 +0000
+++ b/SRNN.lib	Thu Feb 19 13:53:12 2015 +0000
@@ -1,1 +1,1 @@
-SRNN#026d42b4455f
+SRNN#e97ccc643bf1
--- a/main.cpp	Thu Feb 19 08:20:46 2015 +0000
+++ b/main.cpp	Thu Feb 19 13:53:12 2015 +0000
@@ -36,29 +36,20 @@
 
 
     // データ更新
-    // __disable_irq(); // 割り込み禁止
     sensor_module->read_all_sensor();
     new_seqence_data[TEMPERATURE]  = sensor_module->get_temperture();
     new_seqence_data[AIR_PRESSURE] = sensor_module->get_pressure();
     new_seqence_data[HUMIDITY]     = sensor_module->get_humidity();
     printf("T:%f P:%f H:%f \r\n", new_seqence_data[TEMPERATURE], new_seqence_data[AIR_PRESSURE], new_seqence_data[HUMIDITY]);
     graphic_handler->set_now_data(new_seqence_data);
-    // __enable_irq();  // 割り込み許可
 
-
-    /*
-    sprintf( str_buf, "%d/%d/%d %d:%d:%d,%.2f,%.2f,%.2f\n",
-                        (local_time_p->tm_year + 1900), (local_time_p->tm_mon + 1), local_time_p->tm_mday, local_time_p->tm_hour, local_time_p->tm_min, local_time_p->tm_sec,
-                        new_seqence_data[TEMPERATURE], new_seqence_data[AIR_PRESSURE], new_seqence_data[HUMIDITY]);
-                        */
     seqence_data_fp = fopen( SEQUENCE_DATA_NAME, "a");
-    // check_file_open( seqence_data_fp, SEQUENCE_DATA_NAME);
+    check_file_open( seqence_data_fp, SEQUENCE_DATA_NAME);
 
     // 形式に沿った文字列を書き出す : y/m/d h:m,<temperature>,<air_pressure>,<humidity>
     fprintf( seqence_data_fp, "%d/%d/%d %d:%d:%d,%f,%f,%f\n",
              (local_time_p->tm_year + 1900), (local_time_p->tm_mon + 1), local_time_p->tm_mday, local_time_p->tm_hour, local_time_p->tm_min, local_time_p->tm_sec,
              new_seqence_data[TEMPERATURE], new_seqence_data[AIR_PRESSURE], new_seqence_data[HUMIDITY]);
-    // fputs( str_buf, seqence_data_fp );
     fclose( seqence_data_fp );
 
 }
@@ -67,7 +58,7 @@
 void ml_task(void const *arg)
 {
     // ローカル変数
-    int line = 0, ret;
+    int line = 0, diff_line;
     //float* srnn_sample = new float[LEN_DATA_SEQUENCE * DIM_SIGNAL];            // SRNNのサンプル
     float srnn_sample[LEN_DATA_SEQUENCE * DIM_SIGNAL];
     // 読み込みバッファ
@@ -81,36 +72,73 @@
     seqence_data_fp = fopen( SEQUENCE_DATA_NAME, "r");
     check_file_open( seqence_data_fp, SEQUENCE_DATA_NAME);
     // まず、行数を数える
-    while( fgets( str_buf, seqence_data_fp) != NULL ) {
-        }
+    line = 0;
+    while( fgets( str_buf, BUF_SIZE, seqence_data_fp) != NULL ) {
+        line++;
+    }
+    printf(" line : %d \r\n", line);
+    // 差分行の計算
+    diff_line = (line - LEN_DATA_SEQUENCE);
+    rewind( seqence_data_fp );
+    printf(" go to line : %d \r\n", diff_line);
     line = 0;
+    // 差分行までfpを移動
+    fflush( seqence_data_fp );
+    while( fgets( str_buf, BUF_SIZE, seqence_data_fp) != NULL ) {
+        line++;
+        if ( line == diff_line ) break;
+    }
+    // 最新LEN_DATA_SEQUENCE個のデータを読み込む.
+    line = 0;
+    /*
     while( ( ret = fscanf( seqence_data_fp, " %[^\n,],%f,%f,%f", str_buf, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) {
         if (line == LEN_DATA_SEQUENCE) break;
         memcpy(&(srnn_sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL);
-        printf("sample %d : %s %f %f %f \r\n", line, str_buf, MATRIX_AT(srnn_sample,DIM_SIGNAL,line,0), MATRIX_AT(srnn_sample,DIM_SIGNAL,line,1), MATRIX_AT(srnn_sample,DIM_SIGNAL,line,2));
+        printf("sample %d : %s %f %f %f \r\n", diff_line + line, str_buf, MATRIX_AT(srnn_sample,DIM_SIGNAL,line,0), MATRIX_AT(srnn_sample,DIM_SIGNAL,line,1), MATRIX_AT(srnn_sample,DIM_SIGNAL,line,2));
         line++;
     }
+    */
 
-    /*
     while( fgets( str_buf, BUF_SIZE, seqence_data_fp) != NULL ) {
         if (line == LEN_DATA_SEQUENCE) break;
-        printf("%s \r", str_buf);
+        if (open_count > 20)
+            printf("%d %s \r", line, str_buf);
+
         //sscanf( str_buf, " %[^\n,],%f,%f,%f", str_buf, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) )
         sscanf( str_buf, "%[^,],%[^,],%[^,],%[^,]", str_dummy
                 , str_dum1
                 , str_dum2
                 , str_dum3);
-        srnn_sample[line * DIM_SIGNAL] = float(atof(str_dum1));
-        srnn_sample[line * DIM_SIGNAL + 1] = float(atof(str_dum2));
-        srnn_sample[line * DIM_SIGNAL + 2] = float(atof(str_dum3));
-        printf(" str : %s , f0 : %f , f1 : %f , f2 : %f \r\n", str_dummy
-               , srnn_sample[line * DIM_SIGNAL]
-               , srnn_sample[line * DIM_SIGNAL + 1]
-               , srnn_sample[line * DIM_SIGNAL + 2]);
+
+        // エラーハンドル... 仕様か過失かわからないが, 19回目以降に開いたファイルはおかしい.
+        buf_data[0] = float(atof(str_dum1));
+        buf_data[1] = float(atof(str_dum2));
+        buf_data[2] = float(atof(str_dum3));
+        // 直前の結果+乱数
+        if ( line >= 1 ) {
+            if (fabsf(buf_data[TEMPERATURE] - srnn_sample[(line-1) * DIM_SIGNAL]) > 30)
+                buf_data[TEMPERATURE] = (srnn_sample[(line-1) * DIM_SIGNAL + TEMPERATURE] + uniform_rand(1));
+            if (fabsf(buf_data[AIR_PRESSURE] - srnn_sample[(line-1) * DIM_SIGNAL + AIR_PRESSURE]) > 30)
+                buf_data[AIR_PRESSURE] = (srnn_sample[(line-1) * DIM_SIGNAL + 1] + uniform_rand(1));
+            if (fabsf(buf_data[HUMIDITY] - srnn_sample[(line-1) * DIM_SIGNAL + 2]) > 30)
+                buf_data[HUMIDITY] = (srnn_sample[(line-1) * DIM_SIGNAL + HUMIDITY] + uniform_rand(1));
+        }
+
+        memcpy(&(srnn_sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL);
+        /*
+        srnn_sample[line * DIM_SIGNAL] = buf_data[0];
+        srnn_sample[line * DIM_SIGNAL + 1] = buf_data[1];
+        srnn_sample[line * DIM_SIGNAL + 2] = buf_data[2];
+        */
+
+        if (open_count > 20)
+            printf(" %d str : %s , f0 : %f , f1 : %f , f2 : %f \r\n", line, str_dummy
+                   , srnn_sample[line * DIM_SIGNAL]
+                   , srnn_sample[line * DIM_SIGNAL + 1]
+                   , srnn_sample[line * DIM_SIGNAL + 2]);
         // memcpy(&(srnn_sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL);
         line++;
     }
-    */
 
     fclose( seqence_data_fp );
     srnn->set_sample(srnn_sample);
@@ -119,7 +147,6 @@
     printf("Learning... %02d:%02d \r\n", local_time_p->tm_hour, local_time_p->tm_min);
     srnn->learning();
     srnn->predict(new_seqence_data);
-    // 金曜日ここから
     memcpy(new_predict_data, srnn->predict_signal, sizeof(float) * DIM_SIGNAL * PREDICT_LENGTH);
     // MCSVMによる天候識別
     for (int i_predict = 0; i_predict < PREDICT_LENGTH; i_predict++) {
@@ -180,17 +207,18 @@
     while (true) {
 
         if (ml_flag) {
-            Thread::signal_wait(0x3, osWaitForever);
+            Thread::signal_wait(0x2, osWaitForever);
         }
-        // 1. 描画更新 <- 学習中は止めたい...
-        printf("draw thread start. \r\n");
+
+        // printf("draw thread start. \r\n");
         if (time(NULL) % 60 == 0) {
             // 一分毎に表示時間を更新
             graphic_handler->update_time();
         }
         graphic_handler->update_image();
+        // 画面更新
         graphic_handler->update_draw();
-        printf("draw thread finish. \r\n");
+        // printf("draw thread finish. \r\n");
         Thread::wait(1 * 1000);
 
     }
@@ -231,30 +259,28 @@
 {
     set_new_handler(no_memory);
     local_fs = new LocalFileSystem("local");
+    
     setup();
 
+    // graphic_handler->draw_log("setup finish");
     ml_flag = 1;
 
     Thread draw_thread(draw_task, NULL, osPriorityNormal, 2000);
     Thread liveled_thread(liveled_task, NULL, osPriorityLow, 200);
-
-    // Thread read_thread(read_task, NULL, osPriorityNormal);
-
+    
     osThreadSetPriority(Thread::gettid() ,osPriorityHigh);
     while (true) {
-        Thread::wait(4 * 1000);
-        now_time = get_JST();
+        ml_flag = 1;
+        now_time = time(NULL);
         local_time_p = localtime(&now_time);
         read_task(NULL);
-        // truncate_data_file();
         ml_task(NULL);
         ml_flag = 0;
         liveled_thread.signal_set(0x1);
-        draw_thread.signal_set(0x3);
+        draw_thread.signal_set(0x2);
+        Thread::wait(2 * 1000);
     }
-
-    printf("finished.");
-
-    return 1;
+    
+    error("unreachable here");
 
 }
--- a/setup.cpp	Thu Feb 19 08:20:46 2015 +0000
+++ b/setup.cpp	Thu Feb 19 13:53:12 2015 +0000
@@ -94,6 +94,7 @@
 
     int line = 0;
     while( ( ret = fscanf( srnn_setup_fp, " %[^\n,],%f,%f,%f", buf_str, &(buf_data[0]), &(buf_data[1]), &(buf_data[2])) ) != EOF ) {
+        if ( line == LEN_DATA_SEQUENCE ) break;
         memcpy(&(sample[line * DIM_SIGNAL]), buf_data, sizeof(float) * DIM_SIGNAL);
         // printf("sample %d : %f %f %f \r\n", line, MATRIX_AT(sample,DIM_SIGNAL,line,0), MATRIX_AT(sample,DIM_SIGNAL,line,1), MATRIX_AT(sample,DIM_SIGNAL,line,2));
         line++;
@@ -156,7 +157,7 @@
 // グラフィックハンドラの初期化
 static void graphic_handler_setup(void)
 {
-    graphic_handler = new GraphicHandler(DIM_SIGNAL,  PREDICT_INTERVAL_TIME, PREDICT_LENGTH, get_JST());
+    graphic_handler = new GraphicHandler(DIM_SIGNAL,  PREDICT_INTERVAL_TIME, PREDICT_LENGTH, time(NULL));
 }
 
 // データの初期化(アロケート)
@@ -168,6 +169,25 @@
     new_predict_probability = new float[PREDICT_LENGTH];                // 現在の予測天気の確率
 }
 
+// 時刻の設定
+static void jst_setup(int year, int month, int day, int hour, int min)
+{
+    // setup time structure
+    if ( time(NULL) == 0 ) {
+        struct tm t;
+        t.tm_sec  = 0;          // 0-59
+        t.tm_min  = min;        // 0-59
+        t.tm_hour = hour;       // 0-23
+        t.tm_mday = day;        // 1-31
+        t.tm_mon  = (month-1);    // 0-11
+        t.tm_year = (year-1900);  // year since 1900
+
+        // convert to timestamp and set
+        time_t seconds = mktime(&t);
+        set_time(seconds);
+    }
+}
+
 // セットアップ.
 void setup(void)
 {
@@ -179,9 +199,9 @@
     printf("SRNN ...OK \r\n");
     sensor_setup();
     printf("SENSOR ...OK \r\n");
-    //network_setup();
-    set_time(time(NULL));
-    printf("NETWORK ...NO(offline) \r\n");
+    // network_setup();
+    jst_setup(2015, 2, 19, 21, 30);
+    // printf("NETWORK ...NO(offline) \r\n");
     graphic_handler_setup();
     printf("GRAPHIC ...OK \r\n");
     data_setup();