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