sakura.io Evalution Board's sample program of power management.
Dependencies: AQM0802A SakuraIO mbed
main.cpp@0:4387b9fc4c58, 2018-05-15 (annotated)
- Committer:
- okuhara
- Date:
- Tue May 15 02:30:39 2018 +0000
- Revision:
- 0:4387b9fc4c58
- Child:
- 1:c92bbea0eec1
initial commit.
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:4387b9fc4c58 | 20 | DigitalOut leds[] = {led_1, led_2, led_3}; |
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 | 0:4387b9fc4c58 | 33 | DigitalIn sws[] = {sw_1, sw_2, sw_3}; |
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 | 0:4387b9fc4c58 | 73 | static uint8_t prev_sw[3] = {1, 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 | 0:4387b9fc4c58 | 79 | // 動作中LEDを点滅させる |
okuhara | 0:4387b9fc4c58 | 80 | led_4 = !led_4; |
okuhara | 0:4387b9fc4c58 | 81 | |
okuhara | 0:4387b9fc4c58 | 82 | // 省電力モードをSW1-SW3で選択する。 |
okuhara | 0:4387b9fc4c58 | 83 | for (int i = 0; i < 3; i++) { |
okuhara | 0:4387b9fc4c58 | 84 | if ((prev_sw[i] == 1) && (sws[i] == 0)) { |
okuhara | 0:4387b9fc4c58 | 85 | mode = i; |
okuhara | 0:4387b9fc4c58 | 86 | } |
okuhara | 0:4387b9fc4c58 | 87 | prev_sw[i] = sws[i]; |
okuhara | 0:4387b9fc4c58 | 88 | } |
okuhara | 0:4387b9fc4c58 | 89 | if (mode < 3) { |
okuhara | 0:4387b9fc4c58 | 90 | pc.printf("Selected PowerSaveMode: %d\r\n", mode); |
okuhara | 0:4387b9fc4c58 | 91 | uint8_t ret = sakuraio.setPowerSaveMode(mode); |
okuhara | 0:4387b9fc4c58 | 92 | pc.printf("setPowerSaveMode(): %d\r\n", ret); |
okuhara | 0:4387b9fc4c58 | 93 | } |
okuhara | 0:4387b9fc4c58 | 94 | |
okuhara | 0:4387b9fc4c58 | 95 | // 選択されている省電力モードを取得 |
okuhara | 0:4387b9fc4c58 | 96 | uint8_t stat = sakuraio.getPowerSaveMode(); |
okuhara | 0:4387b9fc4c58 | 97 | led_1 = (stat == 0) ? 1 : 0; |
okuhara | 0:4387b9fc4c58 | 98 | led_2 = (stat == 1) ? 1 : 0; |
okuhara | 0:4387b9fc4c58 | 99 | led_3 = (stat == 2) ? 1 : 0; |
okuhara | 0:4387b9fc4c58 | 100 | |
okuhara | 0:4387b9fc4c58 | 101 | // 接続状態を表示 |
okuhara | 0:4387b9fc4c58 | 102 | cnstat = sakuraio.getConnectionStatus(); |
okuhara | 0:4387b9fc4c58 | 103 | if (prev_cnstat != cnstat) { |
okuhara | 0:4387b9fc4c58 | 104 | lcd.cls(); |
okuhara | 0:4387b9fc4c58 | 105 | if ((cnstat & 0x80) == 0x80 ) { |
okuhara | 0:4387b9fc4c58 | 106 | lcd.printf("Online"); |
okuhara | 0:4387b9fc4c58 | 107 | } else { |
okuhara | 0:4387b9fc4c58 | 108 | lcd.printf("Offline"); |
okuhara | 0:4387b9fc4c58 | 109 | } |
okuhara | 0:4387b9fc4c58 | 110 | } |
okuhara | 0:4387b9fc4c58 | 111 | prev_cnstat = cnstat; |
okuhara | 0:4387b9fc4c58 | 112 | |
okuhara | 0:4387b9fc4c58 | 113 | // 選択されている省電力モードをsakura.ioで送信 |
okuhara | 0:4387b9fc4c58 | 114 | send_sw = sw_4; |
okuhara | 0:4387b9fc4c58 | 115 | if ((cnstat & 0x80) == 0x80) { |
okuhara | 0:4387b9fc4c58 | 116 | if ((prev_send_sw == 1) && (send_sw == 0)) { |
okuhara | 0:4387b9fc4c58 | 117 | sakuraio.enqueueTx(0, (int32_t)stat); |
okuhara | 0:4387b9fc4c58 | 118 | sakuraio.send(); |
okuhara | 0:4387b9fc4c58 | 119 | } |
okuhara | 0:4387b9fc4c58 | 120 | } |
okuhara | 0:4387b9fc4c58 | 121 | prev_send_sw = send_sw; |
okuhara | 0:4387b9fc4c58 | 122 | |
okuhara | 0:4387b9fc4c58 | 123 | // WAKE_INを設定 |
okuhara | 0:4387b9fc4c58 | 124 | wake_in = sw_5; |
okuhara | 0:4387b9fc4c58 | 125 | |
okuhara | 0:4387b9fc4c58 | 126 | uint8_t available, queued; |
okuhara | 0:4387b9fc4c58 | 127 | if (sakuraio.getRxQueueLength(&available, &queued) == CMD_ERROR_NONE) { |
okuhara | 0:4387b9fc4c58 | 128 | for (int i = 0; i < queued; i++) { |
okuhara | 0:4387b9fc4c58 | 129 | uint8_t ch, typ, val[8]; |
okuhara | 0:4387b9fc4c58 | 130 | int64_t offset; |
okuhara | 0:4387b9fc4c58 | 131 | if (sakuraio.dequeueRx(&ch, &typ, val, &offset) == CMD_ERROR_NONE) { |
okuhara | 0:4387b9fc4c58 | 132 | if (ch == 0) { |
okuhara | 0:4387b9fc4c58 | 133 | lcd_led = val[0]; |
okuhara | 0:4387b9fc4c58 | 134 | } |
okuhara | 0:4387b9fc4c58 | 135 | } |
okuhara | 0:4387b9fc4c58 | 136 | } |
okuhara | 0:4387b9fc4c58 | 137 | } |
okuhara | 0:4387b9fc4c58 | 138 | wait(0.2); |
okuhara | 0:4387b9fc4c58 | 139 | } |
okuhara | 0:4387b9fc4c58 | 140 | |
okuhara | 0:4387b9fc4c58 | 141 | int main() |
okuhara | 0:4387b9fc4c58 | 142 | { |
okuhara | 0:4387b9fc4c58 | 143 | setup(); |
okuhara | 0:4387b9fc4c58 | 144 | while(1) { |
okuhara | 0:4387b9fc4c58 | 145 | loop(); |
okuhara | 0:4387b9fc4c58 | 146 | } |
okuhara | 0:4387b9fc4c58 | 147 | } |