Raspberry Pi Power Controller by LPC1114

Dependencies:   mbed

Committer:
TareObjects
Date:
Fri Dec 01 08:27:11 2017 +0000
Revision:
4:7117eb230044
Parent:
3:b7b9d3d4eed8
???????????;

Who changed what in which revision?

UserRevisionLine numberNew 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 }