sakura.io Evalution Board's sample program of power management.

Dependencies:   AQM0802A SakuraIO mbed

Committer:
okuhara
Date:
Thu May 31 07:06:53 2018 +0000
Revision:
1:c92bbea0eec1
Parent:
0:4387b9fc4c58
Add "DeepSleep" message on LCD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okuhara 0:4387b9fc4c58 1 #include <string.h>
okuhara 0:4387b9fc4c58 2 #include <mbed.h>
okuhara 0:4387b9fc4c58 3 #include <AQM0802A.h>
okuhara 0:4387b9fc4c58 4 #include <SakuraIO.h>
okuhara 0:4387b9fc4c58 5 #include "SakuraPinNames.h"
okuhara 0:4387b9fc4c58 6
okuhara 0:4387b9fc4c58 7 // Serial over CMSIS_DAP
okuhara 0:4387b9fc4c58 8 Serial pc(DAP_UART_TX, DAP_UART_RX, 9600);
okuhara 0:4387b9fc4c58 9
okuhara 0:4387b9fc4c58 10 // sakura.io
okuhara 0:4387b9fc4c58 11 DigitalOut wake_in(SCM_WAKE_IN);
okuhara 0:4387b9fc4c58 12 DigitalIn wake_out(SCM_WAKE_OUT);
okuhara 0:4387b9fc4c58 13
okuhara 0:4387b9fc4c58 14 // LED
okuhara 0:4387b9fc4c58 15 DigitalOut led_1(LED1);
okuhara 0:4387b9fc4c58 16 DigitalOut led_2(LED2);
okuhara 0:4387b9fc4c58 17 DigitalOut led_3(LED3);
okuhara 0:4387b9fc4c58 18 DigitalOut led_4(LED4);
okuhara 0:4387b9fc4c58 19
okuhara 1:c92bbea0eec1 20 DigitalOut leds[] = {led_1, led_2};
okuhara 0:4387b9fc4c58 21
okuhara 0:4387b9fc4c58 22 // LCD backlight
okuhara 0:4387b9fc4c58 23 DigitalOut lcd_led(LED_LCD);
okuhara 0:4387b9fc4c58 24
okuhara 0:4387b9fc4c58 25 // Switch
okuhara 0:4387b9fc4c58 26 DigitalIn sw_1(SW1);
okuhara 0:4387b9fc4c58 27 DigitalIn sw_2(SW2);
okuhara 0:4387b9fc4c58 28 DigitalIn sw_3(SW3);
okuhara 0:4387b9fc4c58 29 DigitalIn sw_4(SW4);
okuhara 0:4387b9fc4c58 30 DigitalIn sw_5(SW5);
okuhara 0:4387b9fc4c58 31 DigitalIn sw_6(SW6);
okuhara 0:4387b9fc4c58 32
okuhara 1:c92bbea0eec1 33 DigitalIn sws[] = {sw_1, sw_2};
okuhara 0:4387b9fc4c58 34
okuhara 0:4387b9fc4c58 35 // Internal I2C
okuhara 0:4387b9fc4c58 36 I2C internal_i2c(I2C_INTERNAL_SDA, I2C_INTERNAL_SCL);
okuhara 0:4387b9fc4c58 37 AQM0802A lcd(internal_i2c);
okuhara 0:4387b9fc4c58 38
okuhara 0:4387b9fc4c58 39 // sakura.io
okuhara 0:4387b9fc4c58 40 //SakuraIO_I2C sakuraio(I2C_SDA, I2C_SCL);
okuhara 0:4387b9fc4c58 41 SPI sakuraio_spi(PB_15, PB_14, PB_13);
okuhara 0:4387b9fc4c58 42 DigitalOut sakuraio_cs(PB_12);
okuhara 0:4387b9fc4c58 43 SakuraIO_SPI sakuraio(sakuraio_spi, sakuraio_cs);
okuhara 0:4387b9fc4c58 44
okuhara 0:4387b9fc4c58 45 static void setup()
okuhara 0:4387b9fc4c58 46 {
okuhara 0:4387b9fc4c58 47 char uid[32];
okuhara 0:4387b9fc4c58 48
okuhara 0:4387b9fc4c58 49 wake_in = 1;
okuhara 0:4387b9fc4c58 50
okuhara 0:4387b9fc4c58 51 pc.printf("Hello World !\r\n");
okuhara 0:4387b9fc4c58 52 lcd.cls();
okuhara 0:4387b9fc4c58 53 lcd.printf("Hello");
okuhara 0:4387b9fc4c58 54
okuhara 0:4387b9fc4c58 55 while (sw_6 == 0) {
okuhara 0:4387b9fc4c58 56 wait(0.1);
okuhara 0:4387b9fc4c58 57 }
okuhara 0:4387b9fc4c58 58
okuhara 0:4387b9fc4c58 59 lcd_led = 1;
okuhara 0:4387b9fc4c58 60
okuhara 0:4387b9fc4c58 61 memset(uid, 0, sizeof(uid));
okuhara 0:4387b9fc4c58 62 sakuraio.getUniqueID(uid);
okuhara 0:4387b9fc4c58 63 lcd.cls();
okuhara 0:4387b9fc4c58 64 pc.printf("UniqueID: %s\r\n", uid);
okuhara 0:4387b9fc4c58 65
okuhara 0:4387b9fc4c58 66 lcd.printf("........");
okuhara 0:4387b9fc4c58 67 led_4 = 1;
okuhara 0:4387b9fc4c58 68 }
okuhara 0:4387b9fc4c58 69
okuhara 0:4387b9fc4c58 70 static void loop()
okuhara 0:4387b9fc4c58 71 {
okuhara 0:4387b9fc4c58 72 uint8_t mode = 0xff;
okuhara 1:c92bbea0eec1 73 static uint8_t prev_sw[3] = {1, 1};
okuhara 0:4387b9fc4c58 74 uint8_t send_sw;
okuhara 0:4387b9fc4c58 75 static uint8_t prev_send_sw = 1;
okuhara 0:4387b9fc4c58 76 uint8_t cnstat;
okuhara 0:4387b9fc4c58 77 static uint8_t prev_cnstat = 0xff;
okuhara 0:4387b9fc4c58 78
okuhara 1:c92bbea0eec1 79 // WAKE_INを設定
okuhara 1:c92bbea0eec1 80 if (wake_in != sw_5) {
okuhara 1:c92bbea0eec1 81 lcd.cls();
okuhara 1:c92bbea0eec1 82 if (sw_5 == 1) {
okuhara 1:c92bbea0eec1 83 lcd.printf("Running");
okuhara 1:c92bbea0eec1 84 } else {
okuhara 1:c92bbea0eec1 85 lcd.printf("DeepSleep");
okuhara 1:c92bbea0eec1 86 cnstat = 0xff;
okuhara 1:c92bbea0eec1 87 led_4 = 0;
okuhara 1:c92bbea0eec1 88 }
okuhara 1:c92bbea0eec1 89 }
okuhara 1:c92bbea0eec1 90 wake_in = sw_5;
okuhara 1:c92bbea0eec1 91 if (wake_in == 0) {
okuhara 1:c92bbea0eec1 92 wait(0.1);
okuhara 1:c92bbea0eec1 93 return;
okuhara 1:c92bbea0eec1 94 }
okuhara 1:c92bbea0eec1 95
okuhara 0:4387b9fc4c58 96 // 動作中LEDを点滅させる
okuhara 0:4387b9fc4c58 97 led_4 = !led_4;
okuhara 0:4387b9fc4c58 98
okuhara 0:4387b9fc4c58 99 // 省電力モードをSW1-SW3で選択する。
okuhara 0:4387b9fc4c58 100 for (int i = 0; i < 3; i++) {
okuhara 0:4387b9fc4c58 101 if ((prev_sw[i] == 1) && (sws[i] == 0)) {
okuhara 0:4387b9fc4c58 102 mode = i;
okuhara 0:4387b9fc4c58 103 }
okuhara 0:4387b9fc4c58 104 prev_sw[i] = sws[i];
okuhara 0:4387b9fc4c58 105 }
okuhara 0:4387b9fc4c58 106 if (mode < 3) {
okuhara 0:4387b9fc4c58 107 pc.printf("Selected PowerSaveMode: %d\r\n", mode);
okuhara 0:4387b9fc4c58 108 uint8_t ret = sakuraio.setPowerSaveMode(mode);
okuhara 0:4387b9fc4c58 109 pc.printf("setPowerSaveMode(): %d\r\n", ret);
okuhara 0:4387b9fc4c58 110 }
okuhara 0:4387b9fc4c58 111
okuhara 0:4387b9fc4c58 112 // 選択されている省電力モードを取得
okuhara 0:4387b9fc4c58 113 uint8_t stat = sakuraio.getPowerSaveMode();
okuhara 0:4387b9fc4c58 114 led_1 = (stat == 0) ? 1 : 0;
okuhara 0:4387b9fc4c58 115 led_2 = (stat == 1) ? 1 : 0;
okuhara 0:4387b9fc4c58 116
okuhara 0:4387b9fc4c58 117 // 接続状態を表示
okuhara 0:4387b9fc4c58 118 cnstat = sakuraio.getConnectionStatus();
okuhara 0:4387b9fc4c58 119 if (prev_cnstat != cnstat) {
okuhara 0:4387b9fc4c58 120 lcd.cls();
okuhara 0:4387b9fc4c58 121 if ((cnstat & 0x80) == 0x80 ) {
okuhara 0:4387b9fc4c58 122 lcd.printf("Online");
okuhara 0:4387b9fc4c58 123 } else {
okuhara 0:4387b9fc4c58 124 lcd.printf("Offline");
okuhara 0:4387b9fc4c58 125 }
okuhara 0:4387b9fc4c58 126 }
okuhara 0:4387b9fc4c58 127 prev_cnstat = cnstat;
okuhara 0:4387b9fc4c58 128
okuhara 0:4387b9fc4c58 129 // 選択されている省電力モードをsakura.ioで送信
okuhara 0:4387b9fc4c58 130 send_sw = sw_4;
okuhara 0:4387b9fc4c58 131 if ((cnstat & 0x80) == 0x80) {
okuhara 0:4387b9fc4c58 132 if ((prev_send_sw == 1) && (send_sw == 0)) {
okuhara 0:4387b9fc4c58 133 sakuraio.enqueueTx(0, (int32_t)stat);
okuhara 0:4387b9fc4c58 134 sakuraio.send();
okuhara 0:4387b9fc4c58 135 }
okuhara 0:4387b9fc4c58 136 }
okuhara 0:4387b9fc4c58 137 prev_send_sw = send_sw;
okuhara 0:4387b9fc4c58 138
okuhara 0:4387b9fc4c58 139 uint8_t available, queued;
okuhara 0:4387b9fc4c58 140 if (sakuraio.getRxQueueLength(&available, &queued) == CMD_ERROR_NONE) {
okuhara 0:4387b9fc4c58 141 for (int i = 0; i < queued; i++) {
okuhara 0:4387b9fc4c58 142 uint8_t ch, typ, val[8];
okuhara 0:4387b9fc4c58 143 int64_t offset;
okuhara 0:4387b9fc4c58 144 if (sakuraio.dequeueRx(&ch, &typ, val, &offset) == CMD_ERROR_NONE) {
okuhara 0:4387b9fc4c58 145 if (ch == 0) {
okuhara 0:4387b9fc4c58 146 lcd_led = val[0];
okuhara 0:4387b9fc4c58 147 }
okuhara 0:4387b9fc4c58 148 }
okuhara 0:4387b9fc4c58 149 }
okuhara 0:4387b9fc4c58 150 }
okuhara 0:4387b9fc4c58 151 wait(0.2);
okuhara 0:4387b9fc4c58 152 }
okuhara 0:4387b9fc4c58 153
okuhara 0:4387b9fc4c58 154 int main()
okuhara 0:4387b9fc4c58 155 {
okuhara 0:4387b9fc4c58 156 setup();
okuhara 0:4387b9fc4c58 157 while(1) {
okuhara 0:4387b9fc4c58 158 loop();
okuhara 0:4387b9fc4c58 159 }
okuhara 0:4387b9fc4c58 160 }