sakura.io Evalution Board's sample program of power management.
Dependencies: AQM0802A SakuraIO mbed
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 }
Generated on Tue Jul 12 2022 20:59:05 by 1.7.2