レンタルサーバーと連携したsakura.ioの運用例
Dependencies: mbed SakuraIO MPU9250_SPI BME280 gps AQM0802A
Diff: main.cpp
- Revision:
- 1:11957db1faa5
- Parent:
- 0:d2c4ee597498
- Child:
- 2:48e7e85cb169
--- a/main.cpp Wed Nov 21 08:54:34 2018 +0000 +++ b/main.cpp Thu Nov 22 08:09:12 2018 +0000 @@ -7,6 +7,7 @@ #include "sensors.h" #include "gps.h" +//LED制御メッセージのタイプ種別の定数 #define MESG_NORMAL 0 #define MESG_INIT 1 @@ -52,6 +53,9 @@ // GPS UART buffer char uart_buffer[128] = {0}; int uart_buffer_index = 0; + +//LED応対s申告の為のLTE接続した直後を検出するためのフラグ +// 0:切断、1:接続直後でLED情報送信中、2:LED状態到達確認済み int connected_now = 0; // NMEA Decoder @@ -176,15 +180,25 @@ return; } else { + //ON_LINEだったとき if(0 == connected_now){ + //接続直後(直前までオフラインだった)時 + + //現在のLED状態を申告する送信 tx_tmp = (MESG_INIT << 8) | (lcd_led & 0xFF); sakuraio.enqueueTx(20, tx_tmp); sakuraio.send(); + + //接続直後でLED情報送信中 connected_now = 1; + + //過去の送信カウント数クリアと、Offlineになってしまった液晶のsend再表示の為 stat_sw5 = -1; } if(1 == connected_now){ + //現在のLED状態を申告に対する応答がプラットフォームから帰ってきてない時 if((tick_by_200ms % RETRY_INTERVAL_TICKS_PAR_COUNT) == 0){ + //一定時間経過していたら再度LED状態を申告 tx_tmp = (MESG_INIT<<8) | (lcd_led & 0xFF); sakuraio.enqueueTx(20, tx_tmp); sakuraio.send(); @@ -194,7 +208,7 @@ - + //スイッチ状態が切り替わった時、もしくは、LTE接続が一旦切れて復帰した時 if (stat_sw5 != sw_5) { stat_sw5 = sw_5; led_3 = stat_sw5; //State: `Send Enable' @@ -210,6 +224,7 @@ } if (stat_sw5 == 1) { + //送信スイッチONの時。送信処理開始 if ((tick_by_200ms % SEND_INTERVAL_TICKS_PAR_COUNT) == 0) { //Send data intarval is 5 minutes. pc.printf("\r\n\r\n--------------------\r\n"); read_sensor_data(); @@ -249,32 +264,59 @@ } } + //受信確認処理 do { rx_available = 0; if ( CMD_ERROR_NONE == sakuraio.getRxQueueLength(&rx_available, &rx_queued)) { + //getRxQueueLengthが成功したとき if (0 < rx_queued) { + //sakura.ioモジュールの受信キューにデータが入っているとき + //キューからひとつデータを取り出す if ( CMD_ERROR_NONE == sakuraio.dequeueRx(&rx_ch, &rx_type, rx_value, &rx_offset)) { + //正常に受信キューからデータを取り出せたとき if ( (20 == rx_ch) && (0x49 == rx_type) ) { + //LED状態の要求、もしくは、LED状態申告の回答のとき + + //受信した32bit整数値が、8bit値が4つの配列になって届くので、ひとつの整数値に整形 rx_val = ( (int64_t)rx_value[3] << 24) + ( (int64_t)rx_value[2] << 16) + ( (int64_t)rx_value[1] << 8) + ( (int64_t)rx_value[0] << 0); + + //受信した32bit値からbitmapに従ってそれぞれの情報の切り出し ch20_ctrl = rx_val & 0xFF; ch20_mesg = (rx_val>>8) & 0xFF; ch20_id = (rx_val>>16) & 0xFFFF; + + if ( (1 == ch20_ctrl) && (MESG_NORMAL == ch20_mesg)) { + //LED状態の要求だったとき tx_tmp = (ch20_id<<16) | (MESG_NORMAL<<8) | (lcd_led & 0xFF); sakuraio.enqueueTx(20, tx_tmp); sakuraio.send(); } if ( (1 == ch20_ctrl) && (MESG_INIT == ch20_mesg)) { + //LED状態申告の回答だったとき + //フラグを進めて、LED状態到達確認済みとし、再送処理を止める connected_now = 2; } } if ( (21 == rx_ch) && (0x49 == rx_type) ) { + //LED設定のとき + + //受信した32bit整数値が、8bit値が4つの配列になって届くので、ひとつの整数値に整形 rx_val = ( (int64_t)rx_value[3] << 24) + ( (int64_t)rx_value[2] << 16) + ( (int64_t)rx_value[1] << 8) + ( (int64_t)rx_value[0] << 0); + + //受信した32bit値からbitmapに従ってそれぞれの情報の切り出し ch20_ctrl = rx_val & 0xFF; ch20_mesg = (rx_val>>8) & 0xFF; ch20_id = (rx_val>>16) & 0xFFFF; + + if ( 1 == ch20_ctrl || 0 == ch20_ctrl ) { + //LED制御値が、0(OFF) or 1(ON)だったとき + + //LEDに制御値を設定 lcd_led = ch20_ctrl; + + //設定後の値をプラットフォームへ返送 tx_tmp = (ch20_id<<16) | (MESG_NORMAL<<8) | (lcd_led & 0xFF); sakuraio.enqueueTx(20, tx_tmp); sakuraio.send(); @@ -283,7 +325,7 @@ } } } - }while(0 < rx_queued); + }while(0 < rx_queued); //受信キューが空になるまで回す