sakura.io Evalution Board's sample program of power management.
Dependencies: AQM0802A SakuraIO mbed
Diff: main.cpp
- Revision:
- 0:4387b9fc4c58
- Child:
- 1:c92bbea0eec1
diff -r 000000000000 -r 4387b9fc4c58 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue May 15 02:30:39 2018 +0000 @@ -0,0 +1,147 @@ +#include <string.h> +#include <mbed.h> +#include <AQM0802A.h> +#include <SakuraIO.h> +#include "SakuraPinNames.h" + +// Serial over CMSIS_DAP +Serial pc(DAP_UART_TX, DAP_UART_RX, 9600); + +// sakura.io +DigitalOut wake_in(SCM_WAKE_IN); +DigitalIn wake_out(SCM_WAKE_OUT); + +// LED +DigitalOut led_1(LED1); +DigitalOut led_2(LED2); +DigitalOut led_3(LED3); +DigitalOut led_4(LED4); + +DigitalOut leds[] = {led_1, led_2, led_3}; + +// LCD backlight +DigitalOut lcd_led(LED_LCD); + +// Switch +DigitalIn sw_1(SW1); +DigitalIn sw_2(SW2); +DigitalIn sw_3(SW3); +DigitalIn sw_4(SW4); +DigitalIn sw_5(SW5); +DigitalIn sw_6(SW6); + +DigitalIn sws[] = {sw_1, sw_2, sw_3}; + +// Internal I2C +I2C internal_i2c(I2C_INTERNAL_SDA, I2C_INTERNAL_SCL); +AQM0802A lcd(internal_i2c); + +// sakura.io +//SakuraIO_I2C sakuraio(I2C_SDA, I2C_SCL); +SPI sakuraio_spi(PB_15, PB_14, PB_13); +DigitalOut sakuraio_cs(PB_12); +SakuraIO_SPI sakuraio(sakuraio_spi, sakuraio_cs); + +static void setup() +{ + char uid[32]; + + wake_in = 1; + + pc.printf("Hello World !\r\n"); + lcd.cls(); + lcd.printf("Hello"); + + while (sw_6 == 0) { + wait(0.1); + } + + lcd_led = 1; + + memset(uid, 0, sizeof(uid)); + sakuraio.getUniqueID(uid); + lcd.cls(); + pc.printf("UniqueID: %s\r\n", uid); + + lcd.printf("........"); + led_4 = 1; +} + +static void loop() +{ + uint8_t mode = 0xff; + static uint8_t prev_sw[3] = {1, 1, 1}; + uint8_t send_sw; + static uint8_t prev_send_sw = 1; + uint8_t cnstat; + static uint8_t prev_cnstat = 0xff; + + // 動作中LEDを点滅させる + led_4 = !led_4; + + // 省電力モードをSW1-SW3で選択する。 + for (int i = 0; i < 3; i++) { + if ((prev_sw[i] == 1) && (sws[i] == 0)) { + mode = i; + } + prev_sw[i] = sws[i]; + } + if (mode < 3) { + pc.printf("Selected PowerSaveMode: %d\r\n", mode); + uint8_t ret = sakuraio.setPowerSaveMode(mode); + pc.printf("setPowerSaveMode(): %d\r\n", ret); + } + + // 選択されている省電力モードを取得 + uint8_t stat = sakuraio.getPowerSaveMode(); + led_1 = (stat == 0) ? 1 : 0; + led_2 = (stat == 1) ? 1 : 0; + led_3 = (stat == 2) ? 1 : 0; + + // 接続状態を表示 + cnstat = sakuraio.getConnectionStatus(); + if (prev_cnstat != cnstat) { + lcd.cls(); + if ((cnstat & 0x80) == 0x80 ) { + lcd.printf("Online"); + } else { + lcd.printf("Offline"); + } + } + prev_cnstat = cnstat; + + // 選択されている省電力モードをsakura.ioで送信 + send_sw = sw_4; + if ((cnstat & 0x80) == 0x80) { + if ((prev_send_sw == 1) && (send_sw == 0)) { + sakuraio.enqueueTx(0, (int32_t)stat); + sakuraio.send(); + } + } + prev_send_sw = send_sw; + + // WAKE_INを設定 + wake_in = sw_5; + + uint8_t available, queued; + if (sakuraio.getRxQueueLength(&available, &queued) == CMD_ERROR_NONE) { + for (int i = 0; i < queued; i++) { + uint8_t ch, typ, val[8]; + int64_t offset; + if (sakuraio.dequeueRx(&ch, &typ, val, &offset) == CMD_ERROR_NONE) { + if (ch == 0) { + lcd_led = val[0]; + } + } + } + } + wait(0.2); +} + +int main() +{ + setup(); + while(1) { + loop(); + } +}