Koichi Kurahashi
/
RPi_1114
Raspberry Pi Power Controller by LPC1114
main.cpp@4:7117eb230044, 2017-12-01 (annotated)
- Committer:
- TareObjects
- Date:
- Fri Dec 01 08:27:11 2017 +0000
- Revision:
- 4:7117eb230044
- Parent:
- 3:b7b9d3d4eed8
???????????;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
TareObjects | 4:7117eb230044 | 1 | // RPi1114 firmware |
TareObjects | 4:7117eb230044 | 2 | // |
TareObjects | 4:7117eb230044 | 3 | // TareObjects - koichi kurahashi |
TareObjects | 4:7117eb230044 | 4 | // |
TareObjects | 4:7117eb230044 | 5 | // ver 1.00 2017-01-16 first version |
TareObjects | 4:7117eb230044 | 6 | // 1.01 2017-01-17 fix bugs : led on when analog read command |
TareObjects | 4:7117eb230044 | 7 | // bad analog channel boudary |
TareObjects | 4:7117eb230044 | 8 | // |
TareObjects | 4:7117eb230044 | 9 | // |
TareObjects | 4:7117eb230044 | 10 | |
TareObjects | 4:7117eb230044 | 11 | |
TareObjects | 4:7117eb230044 | 12 | |
TareObjects | 0:13c37793b4c6 | 13 | #include "mbed.h" |
TareObjects | 0:13c37793b4c6 | 14 | |
TareObjects | 0:13c37793b4c6 | 15 | |
TareObjects | 4:7117eb230044 | 16 | |
TareObjects | 4:7117eb230044 | 17 | const unsigned short version = 0x0101; // ver 1.01 |
TareObjects | 4:7117eb230044 | 18 | |
TareObjects | 2:f6265132c464 | 19 | const int kMaxInteger = 32767; |
TareObjects | 2:f6265132c464 | 20 | const float fFloatScaleValue = 1024.0; // factor to convert long <-> float |
TareObjects | 2:f6265132c464 | 21 | |
TareObjects | 2:f6265132c464 | 22 | // |
TareObjects | 2:f6265132c464 | 23 | // common definition |
TareObjects | 2:f6265132c464 | 24 | // |
TareObjects | 2:f6265132c464 | 25 | |
TareObjects | 0:13c37793b4c6 | 26 | #define kCommandAddress 0x50 |
TareObjects | 2:f6265132c464 | 27 | |
TareObjects | 0:13c37793b4c6 | 28 | |
TareObjects | 2:f6265132c464 | 29 | // internal gpio map |
TareObjects | 2:f6265132c464 | 30 | // |
TareObjects | 2:f6265132c464 | 31 | // dp5 : SDA - RPi's SDA / pad |
TareObjects | 2:f6265132c464 | 32 | // dp14 : on board LED |
TareObjects | 2:f6265132c464 | 33 | // dp15 : rx - RPi's TXD |
TareObjects | 2:f6265132c464 | 34 | // dp16 : tx - RPi's RXD |
TareObjects | 2:f6265132c464 | 35 | // dp17 : out - RPi's power switch |
TareObjects | 2:f6265132c464 | 36 | // dp23 : reset - RPi's GPIO24 |
TareObjects | 2:f6265132c464 | 37 | // dp24 : isp - RPI's GPIO23 |
TareObjects | 2:f6265132c464 | 38 | // dp25 : in - sw1 / pad |
TareObjects | 2:f6265132c464 | 39 | // dp27 : SCL - RPi's SCL / pad |
TareObjects | 2:f6265132c464 | 40 | |
TareObjects | 2:f6265132c464 | 41 | |
TareObjects | 0:13c37793b4c6 | 42 | |
TareObjects | 2:f6265132c464 | 43 | // pad map |
TareObjects | 2:f6265132c464 | 44 | // |
TareObjects | 2:f6265132c464 | 45 | // dp1 digital Pwm : Pwm |
TareObjects | 2:f6265132c464 | 46 | // dp2 digital Pwm : Pwm |
TareObjects | 2:f6265132c464 | 47 | // dp4 digital analog : digital in |
TareObjects | 2:f6265132c464 | 48 | // dp5 I2C(SDA) : RPi(master)'s SDA / pad |
TareObjects | 2:f6265132c464 | 49 | // dp6 digital : digital in |
TareObjects | 2:f6265132c464 | 50 | // dp9 digital analog : analog |
TareObjects | 2:f6265132c464 | 51 | // dp10 digital analog : analog |
TareObjects | 2:f6265132c464 | 52 | // dp11 digital analog : analog |
TareObjects | 2:f6265132c464 | 53 | // dp13 digital analog |
TareObjects | 2:f6265132c464 | 54 | // do18 digital Pwm : Pwm |
TareObjects | 2:f6265132c464 | 55 | // dp25 digital in : sw1 / pad |
TareObjects | 2:f6265132c464 | 56 | // dp26 digital : digital out |
TareObjects | 2:f6265132c464 | 57 | // dp27 I2C(SCL) : RPi(master)'s SCL / pad |
TareObjects | 2:f6265132c464 | 58 | // dp28 digital : digital out |
TareObjects | 2:f6265132c464 | 59 | |
TareObjects | 2:f6265132c464 | 60 | |
TareObjects | 0:13c37793b4c6 | 61 | |
TareObjects | 0:13c37793b4c6 | 62 | |
TareObjects | 2:f6265132c464 | 63 | // |
TareObjects | 2:f6265132c464 | 64 | // I2C typical command format |
TareObjects | 2:f6265132c464 | 65 | // |
TareObjects | 2:f6265132c464 | 66 | // [0] = command |
TareObjects | 2:f6265132c464 | 67 | // [1] = target ch |
TareObjects | 2:f6265132c464 | 68 | // [2] = format |
TareObjects | 2:f6265132c464 | 69 | // 0 : binary |
TareObjects | 2:f6265132c464 | 70 | // [3...] : long |
TareObjects | 2:f6265132c464 | 71 | // 1 : ascii string |
TareObjects | 2:f6265132c464 | 72 | // [3...] : c string |
TareObjects | 2:f6265132c464 | 73 | // |
TareObjects | 2:f6265132c464 | 74 | // endian : little endian |
TareObjects | 2:f6265132c464 | 75 | // |
TareObjects | 2:f6265132c464 | 76 | |
TareObjects | 4:7117eb230044 | 77 | #define kCommandVersion 0x00 // : get version number ver 1.01 |
TareObjects | 4:7117eb230044 | 78 | |
TareObjects | 2:f6265132c464 | 79 | #define kCommandUp 0x10 // i2c command : RPi power on |
TareObjects | 2:f6265132c464 | 80 | #define kCommandDown 0x11 // : RPi power off |
TareObjects | 2:f6265132c464 | 81 | |
TareObjects | 2:f6265132c464 | 82 | #define kCommandLED 0x20 // : led - on/off/flash |
TareObjects | 2:f6265132c464 | 83 | |
TareObjects | 2:f6265132c464 | 84 | #define kCommandAnalogRead 0x30 // : read analog port |
TareObjects | 2:f6265132c464 | 85 | #define kCommandAnalogReset 0x31 // : reset read buffer |
TareObjects | 2:f6265132c464 | 86 | #define kCommandAnalogStart 0x32 // : start fill buffer |
TareObjects | 2:f6265132c464 | 87 | #define kCommandAnalogStop 0x33 // : stop fill buffer |
TareObjects | 2:f6265132c464 | 88 | #define kCommandAnalogLoad 0x34 // : load analog data |
TareObjects | 2:f6265132c464 | 89 | |
TareObjects | 2:f6265132c464 | 90 | #define kCommandPwm 0x40 // : output Pwm |
TareObjects | 2:f6265132c464 | 91 | #define kCommandPwmPeriod 0x41 // : set Pwm period in uSec |
TareObjects | 2:f6265132c464 | 92 | |
TareObjects | 2:f6265132c464 | 93 | #define kCommandDigitalIn 0x50 // : input digital |
TareObjects | 2:f6265132c464 | 94 | |
TareObjects | 2:f6265132c464 | 95 | #define kCommandDigitalOut 0x60 // : output digital |
TareObjects | 2:f6265132c464 | 96 | |
TareObjects | 2:f6265132c464 | 97 | |
TareObjects | 4:7117eb230044 | 98 | |
TareObjects | 2:f6265132c464 | 99 | #define kCommandModeBinary 0x00 // binary mode |
TareObjects | 2:f6265132c464 | 100 | #define kCommandModeASCII 0x10 // ascii mode |
TareObjects | 2:f6265132c464 | 101 | |
TareObjects | 2:f6265132c464 | 102 | // |
TareObjects | 2:f6265132c464 | 103 | // I2C |
TareObjects | 2:f6265132c464 | 104 | // |
TareObjects | 2:f6265132c464 | 105 | |
TareObjects | 2:f6265132c464 | 106 | #define MaxReceiveBufferSize 100 // i2c receiving buffer length |
TareObjects | 2:f6265132c464 | 107 | |
TareObjects | 0:13c37793b4c6 | 108 | I2CSlave slave(dp5, dp27); |
TareObjects | 0:13c37793b4c6 | 109 | |
TareObjects | 2:f6265132c464 | 110 | |
TareObjects | 2:f6265132c464 | 111 | |
TareObjects | 2:f6265132c464 | 112 | // |
TareObjects | 2:f6265132c464 | 113 | // RPi Power Controll |
TareObjects | 2:f6265132c464 | 114 | // |
TareObjects | 2:f6265132c464 | 115 | // [0] command |
TareObjects | 2:f6265132c464 | 116 | // turn on : kCommandUp |
TareObjects | 2:f6265132c464 | 117 | // turn off : kCommandDown |
TareObjects | 2:f6265132c464 | 118 | // [1] ch |
TareObjects | 2:f6265132c464 | 119 | // always 0 |
TareObjects | 2:f6265132c464 | 120 | // [2] format |
TareObjects | 2:f6265132c464 | 121 | // 0 : binary mode |
TareObjects | 2:f6265132c464 | 122 | // 1 : c string mode |
TareObjects | 2:f6265132c464 | 123 | // [3...] data |
TareObjects | 2:f6265132c464 | 124 | // binary mode : little endian long |
TareObjects | 2:f6265132c464 | 125 | // ascii mode : c string |
TareObjects | 2:f6265132c464 | 126 | // |
TareObjects | 2:f6265132c464 | 127 | |
TareObjects | 0:13c37793b4c6 | 128 | DigitalOut rpiPower(dp17); |
TareObjects | 0:13c37793b4c6 | 129 | DigitalOut led(dp14); |
TareObjects | 0:13c37793b4c6 | 130 | |
TareObjects | 2:f6265132c464 | 131 | int powerMode = kCommandUp; |
TareObjects | 1:10aa79121f61 | 132 | |
TareObjects | 2:f6265132c464 | 133 | void powerOff() |
TareObjects | 2:f6265132c464 | 134 | { |
TareObjects | 0:13c37793b4c6 | 135 | rpiPower = 0; |
TareObjects | 0:13c37793b4c6 | 136 | powerMode = kCommandDown; |
TareObjects | 0:13c37793b4c6 | 137 | } |
TareObjects | 0:13c37793b4c6 | 138 | |
TareObjects | 2:f6265132c464 | 139 | void powerOn() |
TareObjects | 2:f6265132c464 | 140 | { |
TareObjects | 0:13c37793b4c6 | 141 | rpiPower = 1; |
TareObjects | 0:13c37793b4c6 | 142 | powerMode = kCommandUp; |
TareObjects | 0:13c37793b4c6 | 143 | } |
TareObjects | 0:13c37793b4c6 | 144 | |
TareObjects | 0:13c37793b4c6 | 145 | |
TareObjects | 2:f6265132c464 | 146 | |
TareObjects | 2:f6265132c464 | 147 | // led modes |
TareObjects | 2:f6265132c464 | 148 | // |
TareObjects | 2:f6265132c464 | 149 | // [0] command |
TareObjects | 2:f6265132c464 | 150 | // led comtrol |
TareObjects | 2:f6265132c464 | 151 | // [1] ch |
TareObjects | 2:f6265132c464 | 152 | // always 0 |
TareObjects | 2:f6265132c464 | 153 | // [2] mode |
TareObjects | 2:f6265132c464 | 154 | // 0 : turn off |
TareObjects | 2:f6265132c464 | 155 | // 1 : turn on |
TareObjects | 2:f6265132c464 | 156 | // 2 : flash |
TareObjects | 2:f6265132c464 | 157 | // |
TareObjects | 2:f6265132c464 | 158 | |
TareObjects | 2:f6265132c464 | 159 | #define kLED_Off 0 // LED off |
TareObjects | 2:f6265132c464 | 160 | #define kLED_On 1 // LED on |
TareObjects | 2:f6265132c464 | 161 | #define kLED_Flash 2 // LED flash |
TareObjects | 2:f6265132c464 | 162 | |
TareObjects | 2:f6265132c464 | 163 | int ledMode = kLED_Flash; |
TareObjects | 2:f6265132c464 | 164 | |
TareObjects | 2:f6265132c464 | 165 | |
TareObjects | 2:f6265132c464 | 166 | void ledOn() |
TareObjects | 2:f6265132c464 | 167 | { |
TareObjects | 0:13c37793b4c6 | 168 | led = 1; |
TareObjects | 0:13c37793b4c6 | 169 | ledMode = kLED_On; |
TareObjects | 0:13c37793b4c6 | 170 | } |
TareObjects | 0:13c37793b4c6 | 171 | |
TareObjects | 2:f6265132c464 | 172 | void ledOff() |
TareObjects | 2:f6265132c464 | 173 | { |
TareObjects | 0:13c37793b4c6 | 174 | led = 0; |
TareObjects | 0:13c37793b4c6 | 175 | ledMode = kLED_Off; |
TareObjects | 0:13c37793b4c6 | 176 | } |
TareObjects | 0:13c37793b4c6 | 177 | |
TareObjects | 0:13c37793b4c6 | 178 | |
TareObjects | 2:f6265132c464 | 179 | |
TareObjects | 2:f6265132c464 | 180 | |
TareObjects | 2:f6265132c464 | 181 | // |
TareObjects | 2:f6265132c464 | 182 | // on board Switch |
TareObjects | 2:f6265132c464 | 183 | // |
TareObjects | 2:f6265132c464 | 184 | DigitalIn sw1(dp25); |
TareObjects | 2:f6265132c464 | 185 | const int SW_OFF = 1; |
TareObjects | 2:f6265132c464 | 186 | const int SW_ON = 0; // pull up |
TareObjects | 2:f6265132c464 | 187 | |
TareObjects | 2:f6265132c464 | 188 | int sw1Mode = SW_OFF; |
TareObjects | 2:f6265132c464 | 189 | int waitForSw1Release = 0; |
TareObjects | 2:f6265132c464 | 190 | |
TareObjects | 2:f6265132c464 | 191 | |
TareObjects | 2:f6265132c464 | 192 | // |
TareObjects | 2:f6265132c464 | 193 | // ADC |
TareObjects | 2:f6265132c464 | 194 | // |
TareObjects | 2:f6265132c464 | 195 | |
TareObjects | 2:f6265132c464 | 196 | #define kMaxAnalogChannels 3 // analog read channels .... never change |
TareObjects | 2:f6265132c464 | 197 | #define kMinAnalogPeriod 10000 // 10mSec is minimum |
TareObjects | 2:f6265132c464 | 198 | #define kMaxAnalogPeriod 10000000 // 10Sec is maximum |
TareObjects | 2:f6265132c464 | 199 | |
TareObjects | 2:f6265132c464 | 200 | const int kMaxAnalogBufferSize = 256; // analog read buffer size |
TareObjects | 2:f6265132c464 | 201 | |
TareObjects | 2:f6265132c464 | 202 | typedef struct { |
TareObjects | 2:f6265132c464 | 203 | unsigned short count; |
TareObjects | 2:f6265132c464 | 204 | unsigned short buffer[kMaxAnalogBufferSize]; |
TareObjects | 2:f6265132c464 | 205 | } AnalogBuffer; |
TareObjects | 2:f6265132c464 | 206 | |
TareObjects | 2:f6265132c464 | 207 | AnalogBuffer analogBuffer[kMaxAnalogChannels]; |
TareObjects | 2:f6265132c464 | 208 | |
TareObjects | 2:f6265132c464 | 209 | AnalogIn analogIn[kMaxAnalogChannels] = {dp9, dp10, dp11}; |
TareObjects | 2:f6265132c464 | 210 | Ticker analogTicker[kMaxAnalogChannels]; |
TareObjects | 2:f6265132c464 | 211 | //Ticker t1, t2, t0; |
TareObjects | 2:f6265132c464 | 212 | |
TareObjects | 2:f6265132c464 | 213 | |
TareObjects | 2:f6265132c464 | 214 | void analogTickerVectors(int ch) { |
TareObjects | 2:f6265132c464 | 215 | if (ch >= 0 && ch < kMaxAnalogChannels) { |
TareObjects | 2:f6265132c464 | 216 | AnalogBuffer *p = &analogBuffer[ch]; |
TareObjects | 2:f6265132c464 | 217 | unsigned short count = p->count; |
TareObjects | 2:f6265132c464 | 218 | if (count < (kMaxAnalogBufferSize-1)) { |
TareObjects | 2:f6265132c464 | 219 | float f = analogIn[ch]; |
TareObjects | 2:f6265132c464 | 220 | unsigned short v = f * fFloatScaleValue; |
TareObjects | 2:f6265132c464 | 221 | p->buffer[count++] = v; |
TareObjects | 2:f6265132c464 | 222 | p->count = count; |
TareObjects | 2:f6265132c464 | 223 | } |
TareObjects | 2:f6265132c464 | 224 | } |
TareObjects | 2:f6265132c464 | 225 | } |
TareObjects | 2:f6265132c464 | 226 | |
TareObjects | 2:f6265132c464 | 227 | |
TareObjects | 2:f6265132c464 | 228 | |
TareObjects | 2:f6265132c464 | 229 | void analogTickerVector0() |
TareObjects | 2:f6265132c464 | 230 | { |
TareObjects | 2:f6265132c464 | 231 | analogTickerVectors(0); |
TareObjects | 2:f6265132c464 | 232 | } |
TareObjects | 2:f6265132c464 | 233 | |
TareObjects | 2:f6265132c464 | 234 | void analogTickerVector1() |
TareObjects | 2:f6265132c464 | 235 | { |
TareObjects | 2:f6265132c464 | 236 | analogTickerVectors(1); |
TareObjects | 2:f6265132c464 | 237 | } |
TareObjects | 2:f6265132c464 | 238 | |
TareObjects | 2:f6265132c464 | 239 | void analogTickerVector2() |
TareObjects | 2:f6265132c464 | 240 | { |
TareObjects | 2:f6265132c464 | 241 | analogTickerVectors(2); |
TareObjects | 2:f6265132c464 | 242 | } |
TareObjects | 2:f6265132c464 | 243 | |
TareObjects | 2:f6265132c464 | 244 | |
TareObjects | 2:f6265132c464 | 245 | |
TareObjects | 2:f6265132c464 | 246 | float execAnalogIn(int ch) |
TareObjects | 2:f6265132c464 | 247 | { |
TareObjects | 4:7117eb230044 | 248 | if (ch >= 0 && ch < kMaxAnalogChannels) { // fix ver 1.01 |
TareObjects | 2:f6265132c464 | 249 | return analogIn[ch]; |
TareObjects | 2:f6265132c464 | 250 | } |
TareObjects | 2:f6265132c464 | 251 | return -1; |
TareObjects | 2:f6265132c464 | 252 | } |
TareObjects | 2:f6265132c464 | 253 | |
TareObjects | 2:f6265132c464 | 254 | |
TareObjects | 2:f6265132c464 | 255 | int execAnalogReset(int ch) |
TareObjects | 2:f6265132c464 | 256 | { |
TareObjects | 2:f6265132c464 | 257 | if (ch >= 0 && ch < kMaxAnalogChannels) { |
TareObjects | 2:f6265132c464 | 258 | analogTicker[ch].detach(); |
TareObjects | 2:f6265132c464 | 259 | analogBuffer[ch].count = 0; |
TareObjects | 2:f6265132c464 | 260 | return 0; |
TareObjects | 2:f6265132c464 | 261 | } |
TareObjects | 2:f6265132c464 | 262 | return -1; |
TareObjects | 2:f6265132c464 | 263 | } |
TareObjects | 2:f6265132c464 | 264 | |
TareObjects | 2:f6265132c464 | 265 | |
TareObjects | 2:f6265132c464 | 266 | int execAnalogStart(int ch, long value) |
TareObjects | 2:f6265132c464 | 267 | { |
TareObjects | 2:f6265132c464 | 268 | if (ch >=0 && ch < kMaxAnalogChannels) { |
TareObjects | 2:f6265132c464 | 269 | analogBuffer[ch].count = 0; |
TareObjects | 2:f6265132c464 | 270 | value *= 1000; |
TareObjects | 2:f6265132c464 | 271 | if (value < kMinAnalogPeriod || value > kMaxAnalogPeriod) { |
TareObjects | 2:f6265132c464 | 272 | value = 1000; // 1 sec |
TareObjects | 2:f6265132c464 | 273 | } |
TareObjects | 2:f6265132c464 | 274 | switch (ch) { |
TareObjects | 2:f6265132c464 | 275 | case 0: analogTicker[ch].attach_us(&analogTickerVector0, value); break; |
TareObjects | 2:f6265132c464 | 276 | case 1: analogTicker[ch].attach_us(&analogTickerVector1, value); break; |
TareObjects | 2:f6265132c464 | 277 | case 2: analogTicker[ch].attach_us(&analogTickerVector2, value); break; |
TareObjects | 2:f6265132c464 | 278 | } |
TareObjects | 2:f6265132c464 | 279 | return 0; |
TareObjects | 2:f6265132c464 | 280 | } |
TareObjects | 2:f6265132c464 | 281 | |
TareObjects | 2:f6265132c464 | 282 | return -1; |
TareObjects | 2:f6265132c464 | 283 | } |
TareObjects | 2:f6265132c464 | 284 | |
TareObjects | 2:f6265132c464 | 285 | |
TareObjects | 2:f6265132c464 | 286 | int execAnalogStop(int ch) |
TareObjects | 2:f6265132c464 | 287 | { |
TareObjects | 2:f6265132c464 | 288 | if (ch >= 0 && ch < kMaxAnalogChannels) { |
TareObjects | 2:f6265132c464 | 289 | analogTicker[ch].detach(); |
TareObjects | 2:f6265132c464 | 290 | return 0; |
TareObjects | 2:f6265132c464 | 291 | } |
TareObjects | 2:f6265132c464 | 292 | return -1; |
TareObjects | 2:f6265132c464 | 293 | } |
TareObjects | 2:f6265132c464 | 294 | |
TareObjects | 2:f6265132c464 | 295 | |
TareObjects | 2:f6265132c464 | 296 | |
TareObjects | 2:f6265132c464 | 297 | |
TareObjects | 2:f6265132c464 | 298 | |
TareObjects | 2:f6265132c464 | 299 | |
TareObjects | 2:f6265132c464 | 300 | |
TareObjects | 2:f6265132c464 | 301 | |
TareObjects | 2:f6265132c464 | 302 | |
TareObjects | 2:f6265132c464 | 303 | |
TareObjects | 2:f6265132c464 | 304 | |
TareObjects | 2:f6265132c464 | 305 | |
TareObjects | 2:f6265132c464 | 306 | |
TareObjects | 2:f6265132c464 | 307 | |
TareObjects | 2:f6265132c464 | 308 | |
TareObjects | 2:f6265132c464 | 309 | |
TareObjects | 2:f6265132c464 | 310 | // |
TareObjects | 2:f6265132c464 | 311 | // Digital Read |
TareObjects | 2:f6265132c464 | 312 | // |
TareObjects | 2:f6265132c464 | 313 | const int kMaxDigitalInChannels = 2; |
TareObjects | 2:f6265132c464 | 314 | |
TareObjects | 2:f6265132c464 | 315 | DigitalIn digitalIn[kMaxDigitalInChannels] = {dp4,dp6}; |
TareObjects | 2:f6265132c464 | 316 | |
TareObjects | 2:f6265132c464 | 317 | int execDigitalIn(int ch) |
TareObjects | 2:f6265132c464 | 318 | { |
TareObjects | 2:f6265132c464 | 319 | if (ch >= 0 && ch < kMaxDigitalInChannels) { |
TareObjects | 2:f6265132c464 | 320 | return digitalIn[ch]; |
TareObjects | 2:f6265132c464 | 321 | } |
TareObjects | 2:f6265132c464 | 322 | return -1; |
TareObjects | 2:f6265132c464 | 323 | } |
TareObjects | 2:f6265132c464 | 324 | |
TareObjects | 2:f6265132c464 | 325 | |
TareObjects | 2:f6265132c464 | 326 | |
TareObjects | 2:f6265132c464 | 327 | // |
TareObjects | 2:f6265132c464 | 328 | // Digital Write |
TareObjects | 2:f6265132c464 | 329 | // |
TareObjects | 2:f6265132c464 | 330 | |
TareObjects | 2:f6265132c464 | 331 | const int kMaxDigitalOutChannels = 2; |
TareObjects | 2:f6265132c464 | 332 | |
TareObjects | 2:f6265132c464 | 333 | DigitalOut digitalOut[kMaxDigitalOutChannels] = {dp26,dp28}; |
TareObjects | 2:f6265132c464 | 334 | |
TareObjects | 2:f6265132c464 | 335 | int execDigitalOut(int ch, long value) |
TareObjects | 2:f6265132c464 | 336 | { |
TareObjects | 2:f6265132c464 | 337 | if (ch >= 0 && ch < kMaxDigitalOutChannels) { |
TareObjects | 2:f6265132c464 | 338 | digitalOut[ch] = value == 0 ? 0 : 1; |
TareObjects | 2:f6265132c464 | 339 | return 0; |
TareObjects | 2:f6265132c464 | 340 | } |
TareObjects | 2:f6265132c464 | 341 | return -1; |
TareObjects | 2:f6265132c464 | 342 | } |
TareObjects | 2:f6265132c464 | 343 | |
TareObjects | 2:f6265132c464 | 344 | |
TareObjects | 2:f6265132c464 | 345 | // |
TareObjects | 2:f6265132c464 | 346 | // Pwm |
TareObjects | 2:f6265132c464 | 347 | // |
TareObjects | 2:f6265132c464 | 348 | |
TareObjects | 2:f6265132c464 | 349 | const int kMaxPwmChannels = 3; |
TareObjects | 2:f6265132c464 | 350 | |
TareObjects | 2:f6265132c464 | 351 | PwmOut Pwm[kMaxPwmChannels] = {dp1, dp2, dp18}; |
TareObjects | 2:f6265132c464 | 352 | |
TareObjects | 2:f6265132c464 | 353 | int execSetPwmPeriod(int ch, long value) |
TareObjects | 2:f6265132c464 | 354 | { |
TareObjects | 3:b7b9d3d4eed8 | 355 | if (ch >= 0 && ch < kMaxPwmChannels && value >= 0 && value <= kMaxInteger) { |
TareObjects | 2:f6265132c464 | 356 | Pwm[ch].period_us(value); |
TareObjects | 2:f6265132c464 | 357 | return 0; |
TareObjects | 2:f6265132c464 | 358 | } |
TareObjects | 2:f6265132c464 | 359 | return -1; |
TareObjects | 2:f6265132c464 | 360 | } |
TareObjects | 2:f6265132c464 | 361 | |
TareObjects | 2:f6265132c464 | 362 | int execPwmOut(int ch, long value) |
TareObjects | 2:f6265132c464 | 363 | { |
TareObjects | 3:b7b9d3d4eed8 | 364 | if (ch >= 0 && ch < kMaxPwmChannels) { |
TareObjects | 2:f6265132c464 | 365 | float f = value / fFloatScaleValue; |
TareObjects | 2:f6265132c464 | 366 | Pwm[ch] = f; |
TareObjects | 2:f6265132c464 | 367 | return 0; |
TareObjects | 2:f6265132c464 | 368 | } |
TareObjects | 2:f6265132c464 | 369 | |
TareObjects | 2:f6265132c464 | 370 | return -1; |
TareObjects | 2:f6265132c464 | 371 | } |
TareObjects | 2:f6265132c464 | 372 | |
TareObjects | 2:f6265132c464 | 373 | |
TareObjects | 2:f6265132c464 | 374 | |
TareObjects | 2:f6265132c464 | 375 | |
TareObjects | 2:f6265132c464 | 376 | // |
TareObjects | 2:f6265132c464 | 377 | // clock for RPi's timer and LED Flashing |
TareObjects | 2:f6265132c464 | 378 | // |
TareObjects | 2:f6265132c464 | 379 | Ticker second; |
TareObjects | 2:f6265132c464 | 380 | long onTimer = -1; |
TareObjects | 2:f6265132c464 | 381 | long offTimer = -1; |
TareObjects | 2:f6265132c464 | 382 | |
TareObjects | 2:f6265132c464 | 383 | void funcSecond() |
TareObjects | 2:f6265132c464 | 384 | { |
TareObjects | 1:10aa79121f61 | 385 | if (onTimer > 0) { |
TareObjects | 1:10aa79121f61 | 386 | onTimer --; |
TareObjects | 1:10aa79121f61 | 387 | if (onTimer == 0) { |
TareObjects | 1:10aa79121f61 | 388 | powerOn(); |
TareObjects | 2:f6265132c464 | 389 | onTimer = -1; |
TareObjects | 1:10aa79121f61 | 390 | } |
TareObjects | 2:f6265132c464 | 391 | } |
TareObjects | 1:10aa79121f61 | 392 | if (offTimer > 0) { |
TareObjects | 1:10aa79121f61 | 393 | offTimer --; |
TareObjects | 1:10aa79121f61 | 394 | if (offTimer == 0) { |
TareObjects | 1:10aa79121f61 | 395 | powerOff(); |
TareObjects | 2:f6265132c464 | 396 | offTimer = -1; |
TareObjects | 0:13c37793b4c6 | 397 | } |
TareObjects | 2:f6265132c464 | 398 | } |
TareObjects | 2:f6265132c464 | 399 | |
TareObjects | 0:13c37793b4c6 | 400 | if (ledMode == kLED_Flash) { |
TareObjects | 0:13c37793b4c6 | 401 | led = 1; |
TareObjects | 0:13c37793b4c6 | 402 | wait_ms(10); |
TareObjects | 0:13c37793b4c6 | 403 | led = 0; |
TareObjects | 2:f6265132c464 | 404 | } |
TareObjects | 0:13c37793b4c6 | 405 | } |
TareObjects | 0:13c37793b4c6 | 406 | |
TareObjects | 2:f6265132c464 | 407 | |
TareObjects | 2:f6265132c464 | 408 | |
TareObjects | 2:f6265132c464 | 409 | // |
TareObjects | 2:f6265132c464 | 410 | // main routine |
TareObjects | 2:f6265132c464 | 411 | // |
TareObjects | 2:f6265132c464 | 412 | |
TareObjects | 2:f6265132c464 | 413 | static char buf[MaxReceiveBufferSize]; |
TareObjects | 2:f6265132c464 | 414 | |
TareObjects | 0:13c37793b4c6 | 415 | int main() |
TareObjects | 0:13c37793b4c6 | 416 | { |
TareObjects | 2:f6265132c464 | 417 | char strBuf[16]; |
TareObjects | 2:f6265132c464 | 418 | char prevCommand = 0; |
TareObjects | 2:f6265132c464 | 419 | char prevCh = 0; |
TareObjects | 2:f6265132c464 | 420 | char prevMode = 0; |
TareObjects | 2:f6265132c464 | 421 | |
TareObjects | 2:f6265132c464 | 422 | for (int i = 0; i < kMaxAnalogChannels; i++) { |
TareObjects | 2:f6265132c464 | 423 | analogBuffer[i].count = 0; |
TareObjects | 2:f6265132c464 | 424 | } |
TareObjects | 2:f6265132c464 | 425 | |
TareObjects | 0:13c37793b4c6 | 426 | slave.address(kCommandAddress); |
TareObjects | 0:13c37793b4c6 | 427 | second.attach(funcSecond, 1); |
TareObjects | 2:f6265132c464 | 428 | |
TareObjects | 1:10aa79121f61 | 429 | sw1.mode(PullNone); |
TareObjects | 2:f6265132c464 | 430 | |
TareObjects | 0:13c37793b4c6 | 431 | powerOn(); |
TareObjects | 2:f6265132c464 | 432 | |
TareObjects | 0:13c37793b4c6 | 433 | while(1) { |
TareObjects | 1:10aa79121f61 | 434 | if (sw1 == SW_ON) { |
TareObjects | 1:10aa79121f61 | 435 | wait_ms(5); |
TareObjects | 1:10aa79121f61 | 436 | waitForSw1Release = 1; |
TareObjects | 1:10aa79121f61 | 437 | } |
TareObjects | 2:f6265132c464 | 438 | |
TareObjects | 1:10aa79121f61 | 439 | if (waitForSw1Release && sw1 == SW_OFF) { |
TareObjects | 1:10aa79121f61 | 440 | if (powerMode == kCommandUp) { |
TareObjects | 1:10aa79121f61 | 441 | powerOff(); |
TareObjects | 1:10aa79121f61 | 442 | } else { |
TareObjects | 1:10aa79121f61 | 443 | powerOn(); |
TareObjects | 1:10aa79121f61 | 444 | } |
TareObjects | 2:f6265132c464 | 445 | waitForSw1Release = 0; |
TareObjects | 1:10aa79121f61 | 446 | } |
TareObjects | 2:f6265132c464 | 447 | |
TareObjects | 0:13c37793b4c6 | 448 | int status = slave.receive(); |
TareObjects | 2:f6265132c464 | 449 | long value = 0; |
TareObjects | 0:13c37793b4c6 | 450 | switch (status) { |
TareObjects | 2:f6265132c464 | 451 | case I2CSlave::WriteAddressed: { |
TareObjects | 0:13c37793b4c6 | 452 | if (slave.read(buf, MaxReceiveBufferSize)) { |
TareObjects | 2:f6265132c464 | 453 | char command = buf[0]; |
TareObjects | 2:f6265132c464 | 454 | char ch = buf[1]; |
TareObjects | 2:f6265132c464 | 455 | char mode = buf[2]; |
TareObjects | 2:f6265132c464 | 456 | value = 0; |
TareObjects | 2:f6265132c464 | 457 | if (mode == kCommandModeBinary) { |
TareObjects | 2:f6265132c464 | 458 | long *p = (long *)buf+3; |
TareObjects | 2:f6265132c464 | 459 | value = *p; |
TareObjects | 2:f6265132c464 | 460 | if (value < 0) value = 0; |
TareObjects | 2:f6265132c464 | 461 | } else if (mode == kCommandModeASCII) { |
TareObjects | 2:f6265132c464 | 462 | value = atol(buf+3); |
TareObjects | 2:f6265132c464 | 463 | } |
TareObjects | 2:f6265132c464 | 464 | |
TareObjects | 2:f6265132c464 | 465 | switch(command) { |
TareObjects | 2:f6265132c464 | 466 | case kCommandUp: |
TareObjects | 2:f6265132c464 | 467 | if (value > 0) { |
TareObjects | 2:f6265132c464 | 468 | onTimer = value; |
TareObjects | 2:f6265132c464 | 469 | } else if (value == 0) { |
TareObjects | 2:f6265132c464 | 470 | powerOn(); |
TareObjects | 2:f6265132c464 | 471 | } |
TareObjects | 2:f6265132c464 | 472 | break; |
TareObjects | 2:f6265132c464 | 473 | |
TareObjects | 2:f6265132c464 | 474 | case kCommandDown: |
TareObjects | 2:f6265132c464 | 475 | if (value > 0) { |
TareObjects | 2:f6265132c464 | 476 | offTimer = value; |
TareObjects | 2:f6265132c464 | 477 | } else if (value == 0) { |
TareObjects | 2:f6265132c464 | 478 | powerOff(); |
TareObjects | 2:f6265132c464 | 479 | } |
TareObjects | 2:f6265132c464 | 480 | break; |
TareObjects | 2:f6265132c464 | 481 | case kCommandLED: |
TareObjects | 2:f6265132c464 | 482 | switch (mode) { |
TareObjects | 2:f6265132c464 | 483 | case 0: |
TareObjects | 2:f6265132c464 | 484 | ledOff(); |
TareObjects | 2:f6265132c464 | 485 | break; |
TareObjects | 2:f6265132c464 | 486 | case 1: |
TareObjects | 2:f6265132c464 | 487 | ledOn(); |
TareObjects | 2:f6265132c464 | 488 | break; |
TareObjects | 2:f6265132c464 | 489 | case 2: |
TareObjects | 2:f6265132c464 | 490 | ledMode = kLED_Flash; |
TareObjects | 2:f6265132c464 | 491 | break; |
TareObjects | 2:f6265132c464 | 492 | } |
TareObjects | 2:f6265132c464 | 493 | break; |
TareObjects | 2:f6265132c464 | 494 | |
TareObjects | 2:f6265132c464 | 495 | case kCommandAnalogReset: |
TareObjects | 2:f6265132c464 | 496 | execAnalogReset(ch); |
TareObjects | 2:f6265132c464 | 497 | break; |
TareObjects | 2:f6265132c464 | 498 | |
TareObjects | 2:f6265132c464 | 499 | case kCommandAnalogStart: |
TareObjects | 2:f6265132c464 | 500 | execAnalogStart(ch, value); |
TareObjects | 2:f6265132c464 | 501 | break; |
TareObjects | 2:f6265132c464 | 502 | |
TareObjects | 2:f6265132c464 | 503 | case kCommandAnalogStop: |
TareObjects | 2:f6265132c464 | 504 | execAnalogStop(ch); |
TareObjects | 2:f6265132c464 | 505 | break; |
TareObjects | 2:f6265132c464 | 506 | |
TareObjects | 2:f6265132c464 | 507 | case kCommandPwm: |
TareObjects | 2:f6265132c464 | 508 | execPwmOut(ch, value); |
TareObjects | 2:f6265132c464 | 509 | break; |
TareObjects | 2:f6265132c464 | 510 | |
TareObjects | 2:f6265132c464 | 511 | case kCommandPwmPeriod: |
TareObjects | 2:f6265132c464 | 512 | execSetPwmPeriod(ch, value); |
TareObjects | 2:f6265132c464 | 513 | break; |
TareObjects | 2:f6265132c464 | 514 | |
TareObjects | 2:f6265132c464 | 515 | case kCommandDigitalOut: |
TareObjects | 2:f6265132c464 | 516 | execDigitalOut(ch, value); |
TareObjects | 2:f6265132c464 | 517 | break; |
TareObjects | 2:f6265132c464 | 518 | |
TareObjects | 2:f6265132c464 | 519 | case kCommandDigitalIn: |
TareObjects | 2:f6265132c464 | 520 | case kCommandAnalogRead: |
TareObjects | 2:f6265132c464 | 521 | case kCommandAnalogLoad: |
TareObjects | 4:7117eb230044 | 522 | case kCommandVersion: // ver 1.01 |
TareObjects | 2:f6265132c464 | 523 | prevCommand = command; |
TareObjects | 2:f6265132c464 | 524 | prevCh = ch; |
TareObjects | 2:f6265132c464 | 525 | prevMode = mode; |
TareObjects | 2:f6265132c464 | 526 | break; |
TareObjects | 0:13c37793b4c6 | 527 | |
TareObjects | 2:f6265132c464 | 528 | default: |
TareObjects | 2:f6265132c464 | 529 | prevCommand = 0; |
TareObjects | 2:f6265132c464 | 530 | break; |
TareObjects | 2:f6265132c464 | 531 | |
TareObjects | 0:13c37793b4c6 | 532 | } |
TareObjects | 0:13c37793b4c6 | 533 | } |
TareObjects | 0:13c37793b4c6 | 534 | break; |
TareObjects | 2:f6265132c464 | 535 | } |
TareObjects | 2:f6265132c464 | 536 | |
TareObjects | 2:f6265132c464 | 537 | case I2CSlave::ReadAddressed: { |
TareObjects | 2:f6265132c464 | 538 | |
TareObjects | 2:f6265132c464 | 539 | switch(prevCommand) { |
TareObjects | 2:f6265132c464 | 540 | case kCommandAnalogRead: |
TareObjects | 2:f6265132c464 | 541 | float f = execAnalogIn(prevCh); |
TareObjects | 2:f6265132c464 | 542 | if (prevMode == kCommandModeBinary) { |
TareObjects | 2:f6265132c464 | 543 | value = f * fFloatScaleValue; // 10bit = 1024.0 |
TareObjects | 2:f6265132c464 | 544 | slave.write((const char *)&value, sizeof(value)); |
TareObjects | 2:f6265132c464 | 545 | } else { |
TareObjects | 2:f6265132c464 | 546 | sprintf(strBuf, "%f", f); |
TareObjects | 2:f6265132c464 | 547 | slave.write(strBuf, strlen(strBuf)+1); |
TareObjects | 2:f6265132c464 | 548 | } |
TareObjects | 2:f6265132c464 | 549 | break; |
TareObjects | 2:f6265132c464 | 550 | |
TareObjects | 2:f6265132c464 | 551 | case kCommandAnalogLoad: // no ascii mode |
TareObjects | 2:f6265132c464 | 552 | if (prevCh < kMaxAnalogChannels) { |
TareObjects | 2:f6265132c464 | 553 | AnalogBuffer *p = &analogBuffer[prevCh]; |
TareObjects | 2:f6265132c464 | 554 | // __disable_irq(); |
TareObjects | 2:f6265132c464 | 555 | unsigned short count = p->count; |
TareObjects | 2:f6265132c464 | 556 | slave.write((const char *)p, sizeof(unsigned short)*(count+1)); |
TareObjects | 2:f6265132c464 | 557 | // __enable_irq(); |
TareObjects | 2:f6265132c464 | 558 | p->count = 0; |
TareObjects | 2:f6265132c464 | 559 | } |
TareObjects | 2:f6265132c464 | 560 | break; |
TareObjects | 2:f6265132c464 | 561 | |
TareObjects | 2:f6265132c464 | 562 | |
TareObjects | 2:f6265132c464 | 563 | case kCommandDigitalIn: |
TareObjects | 2:f6265132c464 | 564 | value = execDigitalIn(prevCh); |
TareObjects | 2:f6265132c464 | 565 | if (prevMode == kCommandModeBinary) { |
TareObjects | 2:f6265132c464 | 566 | slave.write((const char *)&value, sizeof(value)); |
TareObjects | 2:f6265132c464 | 567 | } else { |
TareObjects | 2:f6265132c464 | 568 | sprintf(strBuf, "%ld", value); |
TareObjects | 2:f6265132c464 | 569 | slave.write((const char *)strBuf, strlen(strBuf)+1); |
TareObjects | 2:f6265132c464 | 570 | } |
TareObjects | 2:f6265132c464 | 571 | break; |
TareObjects | 4:7117eb230044 | 572 | |
TareObjects | 4:7117eb230044 | 573 | case kCommandVersion: // ver 1.01 |
TareObjects | 4:7117eb230044 | 574 | slave.write((const char *)&version, sizeof(version)); |
TareObjects | 4:7117eb230044 | 575 | break; |
TareObjects | 2:f6265132c464 | 576 | } |
TareObjects | 2:f6265132c464 | 577 | slave.stop(); |
TareObjects | 2:f6265132c464 | 578 | break; |
TareObjects | 2:f6265132c464 | 579 | } |
TareObjects | 0:13c37793b4c6 | 580 | |
TareObjects | 0:13c37793b4c6 | 581 | default: |
TareObjects | 0:13c37793b4c6 | 582 | wait_ms(1); |
TareObjects | 0:13c37793b4c6 | 583 | break; |
TareObjects | 0:13c37793b4c6 | 584 | } |
TareObjects | 0:13c37793b4c6 | 585 | } |
TareObjects | 2:f6265132c464 | 586 | } |