Firmware for an Android accessory electric bicycle. See http://www.danielcasner.org/tag/ebike/ for some more information on my build.
Dependencies: AndroidAccessory mbed
main.cpp@3:dc564aaf8a81, 2012-08-25 (annotated)
- Committer:
- DanielC
- Date:
- Sat Aug 25 20:09:35 2012 +0000
- Revision:
- 3:dc564aaf8a81
- Parent:
- 2:e2c3c7340fb3
A first public commit. This isn't working code yet but I think it's enough to share to show the structure of what I am developing.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DanielC | 0:220280db0a7b | 1 | #include "mbed.h" |
DanielC | 0:220280db0a7b | 2 | #include "AndroidAccessory.h" |
DanielC | 2:e2c3c7340fb3 | 3 | #include "throttle.h" |
DanielC | 0:220280db0a7b | 4 | |
DanielC | 2:e2c3c7340fb3 | 5 | DigitalOut l_running(LED1); |
DanielC | 2:e2c3c7340fb3 | 6 | DigitalOut l_cruise(LED2); |
DanielC | 2:e2c3c7340fb3 | 7 | DigitalOut l_error(LED3); |
DanielC | 2:e2c3c7340fb3 | 8 | DigitalOut l_debug(LED4); |
DanielC | 2:e2c3c7340fb3 | 9 | |
DanielC | 2:e2c3c7340fb3 | 10 | AnalogIn break_l(p19); |
DanielC | 2:e2c3c7340fb3 | 11 | AnalogIn break_r(p20); |
DanielC | 0:220280db0a7b | 12 | |
DanielC | 0:220280db0a7b | 13 | static const size_t OUTL=61; |
DanielC | 0:220280db0a7b | 14 | static const size_t INBL=61; |
DanielC | 0:220280db0a7b | 15 | |
DanielC | 0:220280db0a7b | 16 | class DroidCycleMbed : public AndroidAccessory { |
DanielC | 0:220280db0a7b | 17 | public: |
DanielC | 1:be88f22fc412 | 18 | DroidCycleMbed(); |
DanielC | 0:220280db0a7b | 19 | |
DanielC | 1:be88f22fc412 | 20 | virtual void setupDevice(); |
DanielC | 0:220280db0a7b | 21 | virtual void resetDevice(); |
DanielC | 0:220280db0a7b | 22 | virtual int callbackRead(u8 *buff, int len); |
DanielC | 0:220280db0a7b | 23 | virtual int callbackWrite(); |
DanielC | 0:220280db0a7b | 24 | |
DanielC | 0:220280db0a7b | 25 | private: |
DanielC | 0:220280db0a7b | 26 | void onTick(); |
DanielC | 2:e2c3c7340fb3 | 27 | void throttleTick(); |
DanielC | 0:220280db0a7b | 28 | char buffer[OUTL]; |
DanielC | 0:220280db0a7b | 29 | int bcount; |
DanielC | 2:e2c3c7340fb3 | 30 | unsigned int blink_counter; |
DanielC | 0:220280db0a7b | 31 | Ticker tick; |
DanielC | 0:220280db0a7b | 32 | Timeout n; |
DanielC | 2:e2c3c7340fb3 | 33 | Throttle* thr; |
DanielC | 2:e2c3c7340fb3 | 34 | float I, v_f, v_r, cadence; |
DanielC | 0:220280db0a7b | 35 | }; |
DanielC | 0:220280db0a7b | 36 | |
DanielC | 1:be88f22fc412 | 37 | DroidCycleMbed::DroidCycleMbed() : AndroidAccessory(INBL, OUTL, |
DanielC | 2:e2c3c7340fb3 | 38 | "DC Labs", |
DanielC | 2:e2c3c7340fb3 | 39 | "DroidCycle", |
DanielC | 2:e2c3c7340fb3 | 40 | "Android E-Bike controller interface", |
DanielC | 2:e2c3c7340fb3 | 41 | "0.1", |
DanielC | 2:e2c3c7340fb3 | 42 | "http://www.danielcasner.org", |
DanielC | 2:e2c3c7340fb3 | 43 | "0000000123456789"), |
DanielC | 2:e2c3c7340fb3 | 44 | bcount(0), |
DanielC | 2:e2c3c7340fb3 | 45 | blink_counter(0), |
DanielC | 2:e2c3c7340fb3 | 46 | thr(NULL) { |
DanielC | 2:e2c3c7340fb3 | 47 | thr = Throttle::getThrottle(&I, &v_f, &v_r, &cadence, &break_l, &break_r); |
DanielC | 1:be88f22fc412 | 48 | tick.attach(this, &DroidCycleMbed::onTick, 0.010); |
DanielC | 1:be88f22fc412 | 49 | } |
DanielC | 1:be88f22fc412 | 50 | |
DanielC | 0:220280db0a7b | 51 | void DroidCycleMbed::setupDevice() { |
DanielC | 0:220280db0a7b | 52 | for (int i=0; i<OUTL; i++) buffer[i] = 0; |
DanielC | 0:220280db0a7b | 53 | bcount = 0; |
DanielC | 0:220280db0a7b | 54 | } |
DanielC | 0:220280db0a7b | 55 | |
DanielC | 0:220280db0a7b | 56 | void DroidCycleMbed::resetDevice() { |
DanielC | 0:220280db0a7b | 57 | setupDevice(); |
DanielC | 0:220280db0a7b | 58 | } |
DanielC | 0:220280db0a7b | 59 | |
DanielC | 0:220280db0a7b | 60 | int DroidCycleMbed::callbackRead(u8 *buf, int len) { |
DanielC | 0:220280db0a7b | 61 | for (int i=0; i<INBL; i++) buf[i] = 0; |
DanielC | 0:220280db0a7b | 62 | |
DanielC | 0:220280db0a7b | 63 | return 0; |
DanielC | 0:220280db0a7b | 64 | } |
DanielC | 0:220280db0a7b | 65 | |
DanielC | 0:220280db0a7b | 66 | int DroidCycleMbed::callbackWrite() { |
DanielC | 0:220280db0a7b | 67 | return false; |
DanielC | 0:220280db0a7b | 68 | } |
DanielC | 0:220280db0a7b | 69 | |
DanielC | 0:220280db0a7b | 70 | |
DanielC | 0:220280db0a7b | 71 | void DroidCycleMbed::onTick() { |
DanielC | 2:e2c3c7340fb3 | 72 | blink_counter++; |
DanielC | 2:e2c3c7340fb3 | 73 | if (blink_counter < 10) l_running = 1; |
DanielC | 3:dc564aaf8a81 | 74 | else if (blink_counter < 200) l_running = 0; |
DanielC | 2:e2c3c7340fb3 | 75 | else blink_counter = 0; |
DanielC | 0:220280db0a7b | 76 | } |
DanielC | 0:220280db0a7b | 77 | |
DanielC | 0:220280db0a7b | 78 | int main() { |
DanielC | 2:e2c3c7340fb3 | 79 | DroidCycleMbed instance; |
DanielC | 2:e2c3c7340fb3 | 80 | |
DanielC | 2:e2c3c7340fb3 | 81 | USBInit(); |
DanielC | 2:e2c3c7340fb3 | 82 | while (1) { |
DanielC | 2:e2c3c7340fb3 | 83 | USBLoop(); |
DanielC | 0:220280db0a7b | 84 | } |
DanielC | 0:220280db0a7b | 85 | } |