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

Dependencies:   AQM0802A SakuraIO mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include <string.h>
00002 #include <mbed.h>
00003 #include <AQM0802A.h>
00004 #include <SakuraIO.h>
00005 #include "SakuraPinNames.h"
00006 
00007 // Serial over CMSIS_DAP
00008 Serial pc(DAP_UART_TX, DAP_UART_RX, 9600);
00009 
00010 // sakura.io
00011 DigitalOut wake_in(SCM_WAKE_IN);
00012 DigitalIn  wake_out(SCM_WAKE_OUT);
00013 
00014 // LED
00015 DigitalOut led_1(LED1);
00016 DigitalOut led_2(LED2);
00017 DigitalOut led_3(LED3);
00018 DigitalOut led_4(LED4);
00019 
00020 DigitalOut leds[] = {led_1, led_2};
00021 
00022 // LCD backlight
00023 DigitalOut lcd_led(LED_LCD);
00024 
00025 // Switch
00026 DigitalIn sw_1(SW1);
00027 DigitalIn sw_2(SW2);
00028 DigitalIn sw_3(SW3);
00029 DigitalIn sw_4(SW4);
00030 DigitalIn sw_5(SW5);
00031 DigitalIn sw_6(SW6);
00032 
00033 DigitalIn sws[] = {sw_1, sw_2};
00034 
00035 // Internal I2C
00036 I2C internal_i2c(I2C_INTERNAL_SDA, I2C_INTERNAL_SCL);
00037 AQM0802A lcd(internal_i2c);
00038 
00039 // sakura.io
00040 //SakuraIO_I2C sakuraio(I2C_SDA, I2C_SCL);
00041 SPI sakuraio_spi(PB_15, PB_14, PB_13);
00042 DigitalOut sakuraio_cs(PB_12);
00043 SakuraIO_SPI sakuraio(sakuraio_spi, sakuraio_cs);
00044 
00045 static void setup()
00046 {
00047     char uid[32];
00048     
00049     wake_in = 1;
00050 
00051     pc.printf("Hello World !\r\n");
00052     lcd.cls();
00053     lcd.printf("Hello");
00054     
00055     while (sw_6 == 0) {
00056         wait(0.1);
00057     } 
00058 
00059     lcd_led = 1;
00060 
00061     memset(uid, 0, sizeof(uid));
00062     sakuraio.getUniqueID(uid);
00063     lcd.cls();
00064     pc.printf("UniqueID: %s\r\n", uid);
00065     
00066     lcd.printf("........");
00067     led_4 = 1;
00068 }
00069 
00070 static void loop()
00071 {
00072     uint8_t mode = 0xff;
00073     static uint8_t prev_sw[3] = {1, 1};
00074     uint8_t send_sw;
00075     static uint8_t prev_send_sw = 1;
00076     uint8_t cnstat;
00077     static uint8_t prev_cnstat = 0xff;
00078 
00079     // WAKE_INを設定
00080     if (wake_in != sw_5) {
00081         lcd.cls(); 
00082         if (sw_5 == 1) {
00083             lcd.printf("Running");
00084         } else {
00085             lcd.printf("DeepSleep");
00086             cnstat = 0xff;
00087             led_4 = 0;
00088         }
00089     }
00090     wake_in = sw_5;
00091     if (wake_in == 0) {
00092         wait(0.1);
00093         return;
00094     }
00095     
00096     // 動作中LEDを点滅させる
00097     led_4 = !led_4;
00098     
00099     // 省電力モードをSW1-SW3で選択する。
00100     for (int i = 0; i < 3; i++) {
00101         if ((prev_sw[i] == 1) && (sws[i] == 0)) {
00102             mode = i;
00103         }
00104         prev_sw[i] = sws[i];
00105     }
00106     if (mode < 3) {
00107         pc.printf("Selected PowerSaveMode: %d\r\n", mode);
00108         uint8_t ret = sakuraio.setPowerSaveMode(mode);
00109         pc.printf("setPowerSaveMode(): %d\r\n", ret);
00110     }
00111     
00112     // 選択されている省電力モードを取得
00113     uint8_t stat = sakuraio.getPowerSaveMode();
00114     led_1 = (stat == 0) ? 1 : 0;
00115     led_2 = (stat == 1) ? 1 : 0;
00116     
00117     // 接続状態を表示
00118     cnstat = sakuraio.getConnectionStatus();
00119     if (prev_cnstat != cnstat) {
00120         lcd.cls();
00121         if ((cnstat & 0x80) == 0x80 ) {
00122             lcd.printf("Online");
00123         } else {
00124             lcd.printf("Offline");
00125         }
00126     }
00127     prev_cnstat = cnstat;
00128     
00129     // 選択されている省電力モードをsakura.ioで送信
00130     send_sw = sw_4;
00131     if ((cnstat & 0x80) == 0x80) {
00132         if ((prev_send_sw == 1) && (send_sw == 0)) {
00133             sakuraio.enqueueTx(0, (int32_t)stat);
00134             sakuraio.send();
00135         }
00136     }
00137     prev_send_sw = send_sw;
00138     
00139     uint8_t available, queued;
00140     if (sakuraio.getRxQueueLength(&available, &queued) == CMD_ERROR_NONE) {
00141         for (int i = 0; i < queued; i++) {
00142             uint8_t ch, typ, val[8];
00143             int64_t offset;
00144             if (sakuraio.dequeueRx(&ch, &typ, val, &offset) == CMD_ERROR_NONE) {
00145                 if (ch == 0) {
00146                     lcd_led = val[0];
00147                 }
00148             }
00149         }
00150     }
00151     wait(0.2);
00152 }
00153 
00154 int main()
00155 {
00156     setup();
00157     while(1) {
00158         loop();
00159     }
00160 }