レンタルサーバーと連携したsakura.ioの運用例

Dependencies:   mbed SakuraIO MPU9250_SPI BME280 gps AQM0802A

Committer:
punix
Date:
Tue Nov 27 06:51:52 2018 +0000
Revision:
2:48e7e85cb169
Parent:
1:11957db1faa5
??????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
punix 0:d2c4ee597498 1 #include <mbed.h>
punix 0:d2c4ee597498 2 #include <AQM0802A.h>
punix 0:d2c4ee597498 3 #include <BME280.h>
punix 0:d2c4ee597498 4 #include <MPU9250.h>
punix 0:d2c4ee597498 5 #include <SakuraIO.h>
punix 0:d2c4ee597498 6 #include "SakuraPinNames.h"
punix 0:d2c4ee597498 7 #include "sensors.h"
punix 0:d2c4ee597498 8 #include "gps.h"
punix 0:d2c4ee597498 9
punix 1:11957db1faa5 10 //LED制御メッセージのタイプ種別の定数
punix 0:d2c4ee597498 11 #define MESG_NORMAL 0
punix 0:d2c4ee597498 12 #define MESG_INIT 1
punix 0:d2c4ee597498 13
punix 0:d2c4ee597498 14
punix 0:d2c4ee597498 15 // Serial over CMSIS_DAP
punix 0:d2c4ee597498 16 Serial pc(DAP_UART_TX, DAP_UART_RX, 9600);
punix 0:d2c4ee597498 17
punix 0:d2c4ee597498 18 // GPS
punix 0:d2c4ee597498 19 Serial gps(GPS_TX, GPS_RX, 9600);
punix 0:d2c4ee597498 20 DigitalOut gps_en(GPS_EN);
punix 0:d2c4ee597498 21
punix 0:d2c4ee597498 22 // LED
punix 0:d2c4ee597498 23 DigitalOut led_1(LED1);
punix 0:d2c4ee597498 24 DigitalOut led_2(LED2);
punix 0:d2c4ee597498 25 DigitalOut led_3(LED3);
punix 0:d2c4ee597498 26 DigitalOut led_4(LED4);
punix 0:d2c4ee597498 27
punix 0:d2c4ee597498 28 // LCD backlight
punix 0:d2c4ee597498 29 DigitalOut lcd_led(LED_LCD);
punix 0:d2c4ee597498 30
punix 0:d2c4ee597498 31 // Switch
punix 0:d2c4ee597498 32 DigitalIn sw_1(SW1);
punix 0:d2c4ee597498 33 DigitalIn sw_2(SW2);
punix 0:d2c4ee597498 34 DigitalIn sw_3(SW3);
punix 0:d2c4ee597498 35 DigitalIn sw_4(SW4);
punix 0:d2c4ee597498 36 DigitalIn sw_5(SW5);
punix 0:d2c4ee597498 37 DigitalIn sw_6(SW6);
punix 0:d2c4ee597498 38
punix 0:d2c4ee597498 39 // Internal I2C
punix 0:d2c4ee597498 40 I2C internal_i2c(I2C_INTERNAL_SDA, I2C_INTERNAL_SCL);
punix 0:d2c4ee597498 41 AQM0802A lcd(internal_i2c);
punix 0:d2c4ee597498 42 BME280 bme280(internal_i2c);
punix 0:d2c4ee597498 43
punix 0:d2c4ee597498 44 // SPI
punix 0:d2c4ee597498 45 SPI internal_mpu9250_spi(SPI_MPU_MOSI, SPI_MPU_MISO, SPI_MPU_SCK);
punix 0:d2c4ee597498 46 mpu9250_spi mpu9250(internal_mpu9250_spi, SPI_MPU_CS);
punix 0:d2c4ee597498 47
punix 0:d2c4ee597498 48 // sakura.io
punix 2:48e7e85cb169 49 //SakuraIO_I2C sakuraio(I2C_SDA, I2C_SCL);
punix 2:48e7e85cb169 50 #define SPI_FREQ (350000)
punix 2:48e7e85cb169 51 SPI sakuraio_spi(PB_15, PB_14, PB_13);
punix 2:48e7e85cb169 52 DigitalOut sakuraio_cs(PB_12);
punix 2:48e7e85cb169 53 SakuraIO_SPI sakuraio(sakuraio_spi, sakuraio_cs);
punix 0:d2c4ee597498 54
punix 0:d2c4ee597498 55 SensorData sensor_data;
punix 0:d2c4ee597498 56
punix 0:d2c4ee597498 57 // GPS UART buffer
punix 0:d2c4ee597498 58 char uart_buffer[128] = {0};
punix 0:d2c4ee597498 59 int uart_buffer_index = 0;
punix 1:11957db1faa5 60
punix 1:11957db1faa5 61 //LED応対s申告の為のLTE接続した直後を検出するためのフラグ
punix 1:11957db1faa5 62 // 0:切断、1:接続直後でLED情報送信中、2:LED状態到達確認済み
punix 0:d2c4ee597498 63 int connected_now = 0;
punix 0:d2c4ee597498 64
punix 0:d2c4ee597498 65 // NMEA Decoder
punix 0:d2c4ee597498 66 GPSDecoder gps_decoder;
punix 0:d2c4ee597498 67
punix 0:d2c4ee597498 68 void gps_uart_buffering_handler();
punix 0:d2c4ee597498 69
punix 2:48e7e85cb169 70 const int SEND_INTERVAL_TICKS_PAR_COUNT = 1500;
punix 0:d2c4ee597498 71
punix 2:48e7e85cb169 72 const int RETRY_INTERVAL_TICKS_PAR_COUNT = 50;
punix 0:d2c4ee597498 73
punix 0:d2c4ee597498 74 void setup()
punix 0:d2c4ee597498 75 {
punix 0:d2c4ee597498 76 lcd_led = 1;
punix 0:d2c4ee597498 77 pc.printf("Hello World !\r\n");
punix 0:d2c4ee597498 78 lcd.cls();
punix 0:d2c4ee597498 79 lcd.printf("Hello");
punix 0:d2c4ee597498 80 connected_now = 0;
punix 0:d2c4ee597498 81
punix 0:d2c4ee597498 82 // Initialize sensors
punix 0:d2c4ee597498 83 bme280.initialize();
punix 0:d2c4ee597498 84 pc.printf("BME280 ok.\r\n");
punix 0:d2c4ee597498 85 mpu9250.init(1, BITS_DLPF_CFG_188HZ);
punix 0:d2c4ee597498 86 pc.printf("MPU9250 ok. WHOAMI=%02x\r\n", mpu9250.whoami());
punix 0:d2c4ee597498 87 if (mpu9250.whoami() != 0x71) {
punix 0:d2c4ee597498 88 pc.printf("[ERROR] MPU9250 init fail.\r\n");
punix 0:d2c4ee597498 89 }
punix 0:d2c4ee597498 90
punix 0:d2c4ee597498 91 mpu9250.set_gyro_scale(BITS_FS_2000DPS); //Set full scale range for gyros
punix 0:d2c4ee597498 92 mpu9250.set_acc_scale(BITS_FS_16G); //Set full scale range for accs
punix 0:d2c4ee597498 93 mpu9250.calib_acc();
punix 0:d2c4ee597498 94 mpu9250.AK8963_calib_Magnetometer();
punix 0:d2c4ee597498 95
punix 0:d2c4ee597498 96 // active high
punix 0:d2c4ee597498 97 gps_en = 1;
punix 0:d2c4ee597498 98 gps.attach(&gps_uart_buffering_handler, Serial::RxIrq);
punix 0:d2c4ee597498 99
punix 0:d2c4ee597498 100 led_1 = 1;
punix 0:d2c4ee597498 101 led_2 = 0;
punix 0:d2c4ee597498 102
punix 0:d2c4ee597498 103 pc.printf("Send par %d seconds.\r\n", (SEND_INTERVAL_TICKS_PAR_COUNT * 200) / 1000);
punix 0:d2c4ee597498 104 }
punix 0:d2c4ee597498 105
punix 0:d2c4ee597498 106 void read_sensor_data()
punix 0:d2c4ee597498 107 {
punix 0:d2c4ee597498 108 sensor_data.bme280.temperature = bme280.getTemperature();
punix 0:d2c4ee597498 109 sensor_data.bme280.pressure = bme280.getPressure();
punix 0:d2c4ee597498 110 sensor_data.bme280.humidity = bme280.getHumidity();
punix 0:d2c4ee597498 111
punix 0:d2c4ee597498 112 mpu9250.read_all();
punix 0:d2c4ee597498 113 sensor_data.mpu9250.temperature = mpu9250.Temperature;
punix 0:d2c4ee597498 114 for (int cnt_send = 0; cnt_send < 3; cnt_send++) {
punix 0:d2c4ee597498 115 sensor_data.mpu9250.accelerometer[cnt_send] = mpu9250.accelerometer_data[cnt_send];
punix 0:d2c4ee597498 116 sensor_data.mpu9250.gyroscope[cnt_send] = mpu9250.gyroscope_data[cnt_send];
punix 0:d2c4ee597498 117 sensor_data.mpu9250.magnetometer[cnt_send] = mpu9250.Magnetometer[cnt_send];
punix 0:d2c4ee597498 118 }
punix 0:d2c4ee597498 119 }
punix 0:d2c4ee597498 120
punix 0:d2c4ee597498 121 void enqueue_sensor_data(int counter)
punix 0:d2c4ee597498 122 {
punix 0:d2c4ee597498 123 sakuraio.enqueueTx(0, (int32_t)counter);
punix 0:d2c4ee597498 124 sakuraio.enqueueTx(1, sensor_data.bme280.temperature);
punix 0:d2c4ee597498 125 sakuraio.enqueueTx(2, sensor_data.bme280.pressure);
punix 0:d2c4ee597498 126 sakuraio.enqueueTx(3, sensor_data.bme280.humidity);
punix 0:d2c4ee597498 127 sakuraio.enqueueTx(4, sensor_data.mpu9250.accelerometer[0]);
punix 0:d2c4ee597498 128 sakuraio.enqueueTx(5, sensor_data.mpu9250.accelerometer[1]);
punix 0:d2c4ee597498 129 sakuraio.enqueueTx(6, sensor_data.mpu9250.accelerometer[2]);
punix 0:d2c4ee597498 130 sakuraio.enqueueTx(7, sensor_data.mpu9250.gyroscope[0]);
punix 0:d2c4ee597498 131 sakuraio.enqueueTx(8, sensor_data.mpu9250.gyroscope[1]);
punix 0:d2c4ee597498 132 sakuraio.enqueueTx(9, sensor_data.mpu9250.gyroscope[2]);
punix 0:d2c4ee597498 133 sakuraio.enqueueTx(10, sensor_data.mpu9250.magnetometer[0]);
punix 0:d2c4ee597498 134 sakuraio.enqueueTx(11, sensor_data.mpu9250.magnetometer[1]);
punix 0:d2c4ee597498 135 sakuraio.enqueueTx(12, sensor_data.mpu9250.magnetometer[2]);
punix 0:d2c4ee597498 136 sakuraio.enqueueTx(13, gps_decoder.get_longitude());
punix 0:d2c4ee597498 137 sakuraio.enqueueTx(14, gps_decoder.get_latitude());
punix 0:d2c4ee597498 138 sakuraio.enqueueTx(15, gps_decoder.get_unixtime());
punix 0:d2c4ee597498 139 }
punix 0:d2c4ee597498 140
punix 0:d2c4ee597498 141 void gps_uart_buffering_handler()
punix 0:d2c4ee597498 142 {
punix 0:d2c4ee597498 143 while (gps.readable() == 1) {
punix 0:d2c4ee597498 144 char c = gps.getc();
punix 0:d2c4ee597498 145 if (c == '\r') {
punix 0:d2c4ee597498 146 continue;
punix 0:d2c4ee597498 147 }
punix 0:d2c4ee597498 148 uart_buffer[uart_buffer_index] = c;
punix 0:d2c4ee597498 149 uart_buffer_index++;
punix 0:d2c4ee597498 150 if (c == '\n') {
punix 0:d2c4ee597498 151 uart_buffer[uart_buffer_index - 1] = '\0';
punix 0:d2c4ee597498 152 gps_decoder.set_nmea_message(uart_buffer);
punix 0:d2c4ee597498 153 gps_decoder.decode();
punix 0:d2c4ee597498 154 uart_buffer_index = 0;
punix 0:d2c4ee597498 155 }
punix 0:d2c4ee597498 156 }
punix 0:d2c4ee597498 157 }
punix 0:d2c4ee597498 158
punix 0:d2c4ee597498 159
punix 0:d2c4ee597498 160 void loop()
punix 0:d2c4ee597498 161 {
punix 0:d2c4ee597498 162 static int cnt_send = 1;
punix 0:d2c4ee597498 163 static int tick_by_200ms = 0;
punix 0:d2c4ee597498 164 static int stat_sw5 = -1;
punix 0:d2c4ee597498 165 uint8_t rx_available = 0;
punix 0:d2c4ee597498 166 uint8_t rx_queued = 0;
punix 0:d2c4ee597498 167 uint8_t rx_ch=0;
punix 0:d2c4ee597498 168 uint8_t rx_type=0;
punix 0:d2c4ee597498 169 uint8_t rx_value[8];
punix 0:d2c4ee597498 170 int64_t rx_offset=0;
punix 0:d2c4ee597498 171 int64_t rx_val;
punix 0:d2c4ee597498 172 uint32_t tx_tmp;
punix 0:d2c4ee597498 173 uint8_t ch20_ctrl;
punix 0:d2c4ee597498 174 uint32_t ch20_id;
punix 0:d2c4ee597498 175 uint8_t ch20_mesg;
punix 0:d2c4ee597498 176
punix 0:d2c4ee597498 177 if((sakuraio.getConnectionStatus() & 0x80) == 0x00) {
punix 0:d2c4ee597498 178 //Offline
punix 0:d2c4ee597498 179 lcd.cls();
punix 0:d2c4ee597498 180 lcd.printf("Offline");
punix 0:d2c4ee597498 181 pc.printf("Network is offline.\r\n(After 1 sec to running retry.)\r\n");
punix 0:d2c4ee597498 182 wait(1);
punix 0:d2c4ee597498 183 connected_now = 0;
punix 0:d2c4ee597498 184 return;
punix 0:d2c4ee597498 185 }
punix 0:d2c4ee597498 186 else {
punix 1:11957db1faa5 187 //ON_LINEだったとき
punix 0:d2c4ee597498 188 if(0 == connected_now){
punix 1:11957db1faa5 189 //接続直後(直前までオフラインだった)時
punix 1:11957db1faa5 190
punix 1:11957db1faa5 191 //現在のLED状態を申告する送信
punix 0:d2c4ee597498 192 tx_tmp = (MESG_INIT << 8) | (lcd_led & 0xFF);
punix 0:d2c4ee597498 193 sakuraio.enqueueTx(20, tx_tmp);
punix 0:d2c4ee597498 194 sakuraio.send();
punix 1:11957db1faa5 195
punix 1:11957db1faa5 196 //接続直後でLED情報送信中
punix 0:d2c4ee597498 197 connected_now = 1;
punix 1:11957db1faa5 198
punix 1:11957db1faa5 199 //過去の送信カウント数クリアと、Offlineになってしまった液晶のsend再表示の為
punix 0:d2c4ee597498 200 stat_sw5 = -1;
punix 0:d2c4ee597498 201 }
punix 0:d2c4ee597498 202 if(1 == connected_now){
punix 1:11957db1faa5 203 //現在のLED状態を申告に対する応答がプラットフォームから帰ってきてない時
punix 0:d2c4ee597498 204 if((tick_by_200ms % RETRY_INTERVAL_TICKS_PAR_COUNT) == 0){
punix 1:11957db1faa5 205 //一定時間経過していたら再度LED状態を申告
punix 0:d2c4ee597498 206 tx_tmp = (MESG_INIT<<8) | (lcd_led & 0xFF);
punix 0:d2c4ee597498 207 sakuraio.enqueueTx(20, tx_tmp);
punix 0:d2c4ee597498 208 sakuraio.send();
punix 0:d2c4ee597498 209 }
punix 0:d2c4ee597498 210 }
punix 0:d2c4ee597498 211 }
punix 0:d2c4ee597498 212
punix 0:d2c4ee597498 213
punix 0:d2c4ee597498 214
punix 1:11957db1faa5 215 //スイッチ状態が切り替わった時、もしくは、LTE接続が一旦切れて復帰した時
punix 0:d2c4ee597498 216 if (stat_sw5 != sw_5) {
punix 0:d2c4ee597498 217 stat_sw5 = sw_5;
punix 0:d2c4ee597498 218 led_3 = stat_sw5; //State: `Send Enable'
punix 0:d2c4ee597498 219 if (stat_sw5 == 0) {
punix 0:d2c4ee597498 220 lcd.cls();
punix 0:d2c4ee597498 221 lcd.printf("Send:OFF");
punix 0:d2c4ee597498 222 } else {
punix 0:d2c4ee597498 223 cnt_send = 1;
punix 0:d2c4ee597498 224 tick_by_200ms = 0;
punix 0:d2c4ee597498 225 lcd.cls();
punix 0:d2c4ee597498 226 lcd.printf("Send:ON");
punix 0:d2c4ee597498 227 }
punix 0:d2c4ee597498 228 }
punix 0:d2c4ee597498 229
punix 0:d2c4ee597498 230 if (stat_sw5 == 1) {
punix 1:11957db1faa5 231 //送信スイッチONの時。送信処理開始
punix 0:d2c4ee597498 232 if ((tick_by_200ms % SEND_INTERVAL_TICKS_PAR_COUNT) == 0) { //Send data intarval is 5 minutes.
punix 0:d2c4ee597498 233 pc.printf("\r\n\r\n--------------------\r\n");
punix 0:d2c4ee597498 234 read_sensor_data();
punix 0:d2c4ee597498 235 pc.printf("BME280\r\n");
punix 0:d2c4ee597498 236 pc.printf("\tTemp: %.2fC\r\n", sensor_data.bme280.temperature);
punix 0:d2c4ee597498 237 pc.printf("\tPres: %.2fhPa\r\n", sensor_data.bme280.pressure);
punix 0:d2c4ee597498 238 pc.printf("\tHum: %.2f%%\r\n", sensor_data.bme280.humidity);
punix 0:d2c4ee597498 239 pc.printf("MPU9250\r\n");
punix 0:d2c4ee597498 240 pc.printf("\tTemp: %.2fC\r\n", sensor_data.mpu9250.temperature);
punix 0:d2c4ee597498 241 for (int j = 0; j < 3; j++) {
punix 0:d2c4ee597498 242 pc.printf("\tacc[%d]: %.2f\r\n", j, sensor_data.mpu9250.accelerometer[j]);
punix 0:d2c4ee597498 243 pc.printf("\tgyro[%d]: %.2f\r\n", j, sensor_data.mpu9250.gyroscope[j]);
punix 0:d2c4ee597498 244 pc.printf("\tmag[%d]: %.2f\r\n", j, sensor_data.mpu9250.magnetometer[j]);
punix 0:d2c4ee597498 245 }
punix 0:d2c4ee597498 246 pc.printf("GPS\r\n");
punix 0:d2c4ee597498 247 pc.printf("\tlat: %f%c\r\n",
punix 0:d2c4ee597498 248 gps_decoder.get_latitude(),
punix 0:d2c4ee597498 249 gps_decoder.get_latitude() >= 0 ? 'N' : 'S');
punix 0:d2c4ee597498 250 pc.printf("\tlon: %f%c\r\n",
punix 0:d2c4ee597498 251 gps_decoder.get_longitude(),
punix 0:d2c4ee597498 252 gps_decoder.get_longitude() >= 0 ? 'E' : 'W');
punix 0:d2c4ee597498 253 pc.printf("\tspeed: %fkm/h\r\n", gps_decoder.get_speed());
punix 0:d2c4ee597498 254 pc.printf("\tmove_direction: %f\r\n", gps_decoder.get_move_direction());
punix 0:d2c4ee597498 255 pc.printf("\tdate: %d/%02d/%02d %02d:%02d:%02d (UTC)\r\n",
punix 0:d2c4ee597498 256 gps_decoder.get_year(), gps_decoder.get_month(), gps_decoder.get_day(),
punix 0:d2c4ee597498 257 gps_decoder.get_hour(), gps_decoder.get_min(), gps_decoder.get_sec());
punix 0:d2c4ee597498 258 pc.printf("\tUNIX time: %d\r\n", gps_decoder.get_unixtime());
punix 0:d2c4ee597498 259 led_2 = 1;
punix 0:d2c4ee597498 260 pc.printf("Send:%d\r\n", cnt_send);
punix 0:d2c4ee597498 261 lcd.setCursor(0, 1);
punix 0:d2c4ee597498 262 lcd.printf("%d", cnt_send);
punix 0:d2c4ee597498 263 enqueue_sensor_data(cnt_send);
punix 0:d2c4ee597498 264 sakuraio.send();
punix 0:d2c4ee597498 265 cnt_send++;
punix 0:d2c4ee597498 266 led_2 = 0;
punix 0:d2c4ee597498 267 pc.printf("After %d sec to send.\r\n", (int)(SEND_INTERVAL_TICKS_PAR_COUNT * 0.2));
punix 0:d2c4ee597498 268 }
punix 0:d2c4ee597498 269 }
punix 0:d2c4ee597498 270
punix 1:11957db1faa5 271 //受信確認処理
punix 0:d2c4ee597498 272 do {
punix 0:d2c4ee597498 273 rx_available = 0;
punix 0:d2c4ee597498 274 if ( CMD_ERROR_NONE == sakuraio.getRxQueueLength(&rx_available, &rx_queued)) {
punix 1:11957db1faa5 275 //getRxQueueLengthが成功したとき
punix 0:d2c4ee597498 276 if (0 < rx_queued) {
punix 1:11957db1faa5 277 //sakura.ioモジュールの受信キューにデータが入っているとき
punix 1:11957db1faa5 278 //キューからひとつデータを取り出す
punix 0:d2c4ee597498 279 if ( CMD_ERROR_NONE == sakuraio.dequeueRx(&rx_ch, &rx_type, rx_value, &rx_offset)) {
punix 1:11957db1faa5 280 //正常に受信キューからデータを取り出せたとき
punix 0:d2c4ee597498 281 if ( (20 == rx_ch) && (0x49 == rx_type) ) {
punix 1:11957db1faa5 282 //LED状態の要求、もしくは、LED状態申告の回答のとき
punix 1:11957db1faa5 283
punix 1:11957db1faa5 284 //受信した32bit整数値が、8bit値が4つの配列になって届くので、ひとつの整数値に整形
punix 0:d2c4ee597498 285 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);
punix 1:11957db1faa5 286
punix 1:11957db1faa5 287 //受信した32bit値からbitmapに従ってそれぞれの情報の切り出し
punix 0:d2c4ee597498 288 ch20_ctrl = rx_val & 0xFF;
punix 0:d2c4ee597498 289 ch20_mesg = (rx_val>>8) & 0xFF;
punix 0:d2c4ee597498 290 ch20_id = (rx_val>>16) & 0xFFFF;
punix 1:11957db1faa5 291
punix 1:11957db1faa5 292
punix 0:d2c4ee597498 293 if ( (1 == ch20_ctrl) && (MESG_NORMAL == ch20_mesg)) {
punix 1:11957db1faa5 294 //LED状態の要求だったとき
punix 0:d2c4ee597498 295 tx_tmp = (ch20_id<<16) | (MESG_NORMAL<<8) | (lcd_led & 0xFF);
punix 0:d2c4ee597498 296 sakuraio.enqueueTx(20, tx_tmp);
punix 0:d2c4ee597498 297 sakuraio.send();
punix 0:d2c4ee597498 298 }
punix 0:d2c4ee597498 299 if ( (1 == ch20_ctrl) && (MESG_INIT == ch20_mesg)) {
punix 1:11957db1faa5 300 //LED状態申告の回答だったとき
punix 1:11957db1faa5 301 //フラグを進めて、LED状態到達確認済みとし、再送処理を止める
punix 0:d2c4ee597498 302 connected_now = 2;
punix 0:d2c4ee597498 303 }
punix 0:d2c4ee597498 304 }
punix 0:d2c4ee597498 305 if ( (21 == rx_ch) && (0x49 == rx_type) ) {
punix 1:11957db1faa5 306 //LED設定のとき
punix 1:11957db1faa5 307
punix 1:11957db1faa5 308 //受信した32bit整数値が、8bit値が4つの配列になって届くので、ひとつの整数値に整形
punix 0:d2c4ee597498 309 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);
punix 1:11957db1faa5 310
punix 1:11957db1faa5 311 //受信した32bit値からbitmapに従ってそれぞれの情報の切り出し
punix 0:d2c4ee597498 312 ch20_ctrl = rx_val & 0xFF;
punix 0:d2c4ee597498 313 ch20_mesg = (rx_val>>8) & 0xFF;
punix 0:d2c4ee597498 314 ch20_id = (rx_val>>16) & 0xFFFF;
punix 1:11957db1faa5 315
punix 1:11957db1faa5 316
punix 0:d2c4ee597498 317 if ( 1 == ch20_ctrl || 0 == ch20_ctrl ) {
punix 1:11957db1faa5 318 //LED制御値が、0(OFF) or 1(ON)だったとき
punix 1:11957db1faa5 319
punix 1:11957db1faa5 320 //LEDに制御値を設定
punix 0:d2c4ee597498 321 lcd_led = ch20_ctrl;
punix 1:11957db1faa5 322
punix 1:11957db1faa5 323 //設定後の値をプラットフォームへ返送
punix 0:d2c4ee597498 324 tx_tmp = (ch20_id<<16) | (MESG_NORMAL<<8) | (lcd_led & 0xFF);
punix 0:d2c4ee597498 325 sakuraio.enqueueTx(20, tx_tmp);
punix 0:d2c4ee597498 326 sakuraio.send();
punix 0:d2c4ee597498 327 }
punix 0:d2c4ee597498 328 }
punix 0:d2c4ee597498 329 }
punix 0:d2c4ee597498 330 }
punix 0:d2c4ee597498 331 }
punix 1:11957db1faa5 332 }while(0 < rx_queued); //受信キューが空になるまで回す
punix 0:d2c4ee597498 333
punix 0:d2c4ee597498 334
punix 0:d2c4ee597498 335
punix 0:d2c4ee597498 336 led_1 = !led_1;
punix 0:d2c4ee597498 337 led_4 = !sw_4;
punix 0:d2c4ee597498 338 tick_by_200ms++;
punix 0:d2c4ee597498 339 wait(0.2);
punix 0:d2c4ee597498 340 }
punix 0:d2c4ee597498 341
punix 0:d2c4ee597498 342
punix 0:d2c4ee597498 343 int main()
punix 0:d2c4ee597498 344 {
punix 0:d2c4ee597498 345 setup();
punix 0:d2c4ee597498 346 while(1) {
punix 0:d2c4ee597498 347 loop();
punix 0:d2c4ee597498 348 }
punix 0:d2c4ee597498 349 }