Koichi Kurahashi
/
RPi_1114
Raspberry Pi Power Controller by LPC1114
Diff: main.cpp
- Revision:
- 0:13c37793b4c6
- Child:
- 1:10aa79121f61
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Jan 03 06:27:05 2017 +0000 @@ -0,0 +1,126 @@ +#include "mbed.h" + + +#define kCommandAddress 0x50 +#define MaxReceiveBufferSize 100 + +#define kCommandUp 'u' // i2c command : up - power on +#define kCommandDown 'd' // : down - power off +#define kCommandLED 'l' // : led - on/off/flash + +#define kLED_Off 0 // LED off +#define kLED_On 1 // LED on +#define kLED_Flash 2 // LED flash + + +I2CSlave slave(dp5, dp27); + +DigitalOut rpiPower(dp17); +DigitalOut led(dp14); + +int powerMode = kCommandUp; +int ledMode = kLED_Flash; + + +static char buf[MaxReceiveBufferSize]; + +Ticker second; +long counter = -1; + +void powerOff() { + rpiPower = 0; + powerMode = kCommandDown; +} + +void powerOn() { + rpiPower = 1; + powerMode = kCommandUp; +} + + +void ledOn() { + led = 1; + ledMode = kLED_On; +} + +void ledOff() { + led = 0; + ledMode = kLED_Off; +} + + +void funcSecond() { + if (counter > 0) { + counter --; + if (counter == 0) { + if (powerMode == kCommandDown) { + powerOn(); + } else { + powerOff(); + } + counter = -1; + } + } + + if (ledMode == kLED_Flash) { + led = 1; + wait_ms(10); + led = 0; + } +} + +int main() +{ + slave.address(kCommandAddress); + second.attach(funcSecond, 1); + + powerOn(); + + while(1) { + int status = slave.receive(); + switch (status) { + case I2CSlave::WriteAddressed: + if (slave.read(buf, MaxReceiveBufferSize)) { + switch(buf[0]) { + case kCommandUp: + if (powerMode == kCommandUp) { + // error already up + } else { + long t = atol(buf+1); + if (t > 0) { + counter = t; + } else if (t == 0) { + powerOn(); + } + } + break; + + case kCommandDown: + if (powerMode == kCommandDown) { + // error already down + } else { + long t = atol(buf+1); + if (t > 0) { + counter = t; + } else if (t == 0) { + powerOn(); + } + } + break; + case kCommandLED: + switch (buf[1]) { + case '0': ledOff(); break; + case '1': ledOn(); break; + case 'f': ledMode = kLED_Flash; break; + } + } + } + break; + + default: + wait_ms(1); + break; + } + } +} +