Light Show library for organic, calm, light display.
Dependencies: BLE_API mbed nRF51822
Fork of mbed_blinky by
main.cpp@23:4bb74b53e112, 2016-01-29 (annotated)
- Committer:
- nargetdev
- Date:
- Fri Jan 29 20:22:02 2016 +0000
- Revision:
- 23:4bb74b53e112
- Parent:
- 22:b618d55e9c9b
- Child:
- 24:52319c0a14b8
uggh
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nargetdev | 18:7c05ef6a639c | 1 | #include "mbed.h" |
nargetdev | 18:7c05ef6a639c | 2 | #include "BLE.h" |
nargetdev | 19:fabe9521b0a1 | 3 | #include "ButtonService.h" |
nargetdev | 19:fabe9521b0a1 | 4 | //#include "UARTService.h" |
nargetdev | 18:7c05ef6a639c | 5 | #include <string> |
nargetdev | 18:7c05ef6a639c | 6 | |
nargetdev | 23:4bb74b53e112 | 7 | |
nargetdev | 23:4bb74b53e112 | 8 | #include "rgb_led.h" |
nargetdev | 23:4bb74b53e112 | 9 | |
nargetdev | 21:3960e3b8ca7b | 10 | #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console; |
nargetdev | 18:7c05ef6a639c | 11 | * it will have an impact on code-size and power consumption. */ |
nargetdev | 11:2d3cc5459d5b | 12 | |
nargetdev | 18:7c05ef6a639c | 13 | #if NEED_CONSOLE_OUTPUT |
nargetdev | 21:3960e3b8ca7b | 14 | #define DEBUG(...) { printf(__VA_ARGS__); } |
nargetdev | 18:7c05ef6a639c | 15 | #else |
nargetdev | 21:3960e3b8ca7b | 16 | #define DEBUG(STR) { if (uartServicePtr) uartServicePtr->write(STR, strlen(STR)); } |
nargetdev | 21:3960e3b8ca7b | 17 | //#else |
nargetdev | 21:3960e3b8ca7b | 18 | //#define DEBUG(...) /* nothing */ |
nargetdev | 21:3960e3b8ca7b | 19 | #endif /* #if NEED_CONSOLE_OUxTPUT */ |
nargetdev | 18:7c05ef6a639c | 20 | |
nargetdev | 18:7c05ef6a639c | 21 | //#define NRFDK |
nargetdev | 18:7c05ef6a639c | 22 | #define MKIT |
nargetdev | 18:7c05ef6a639c | 23 | |
nargetdev | 19:fabe9521b0a1 | 24 | #define CALIBRATION_TIME 3 |
nargetdev | 11:2d3cc5459d5b | 25 | |
nargetdev | 19:fabe9521b0a1 | 26 | //#define HPI 1.571 |
nargetdev | 19:fabe9521b0a1 | 27 | //#define PI 3.1416 |
nargetdev | 19:fabe9521b0a1 | 28 | //#define HYSTERESIS_QUANTITY PI/4 |
nargetdev | 19:fabe9521b0a1 | 29 | // |
nargetdev | 19:fabe9521b0a1 | 30 | //#define RWAIT 0 |
nargetdev | 19:fabe9521b0a1 | 31 | //#define GWAIT PI/8 |
nargetdev | 19:fabe9521b0a1 | 32 | //#define BWAIT PI/4 |
nargetdev | 11:2d3cc5459d5b | 33 | |
nargetdev | 19:fabe9521b0a1 | 34 | |
nargetdev | 19:fabe9521b0a1 | 35 | //UARTService *uartServicePtr; |
nargetdev | 19:fabe9521b0a1 | 36 | const static char DEVICE_NAME[] = "Bathroom"; |
nargetdev | 19:fabe9521b0a1 | 37 | static const uint16_t uuid16_list[] = {ButtonService::BUTTON_SERVICE_UUID}; |
nargetdev | 18:7c05ef6a639c | 38 | |
nargetdev | 19:fabe9521b0a1 | 39 | uint8_t motionState = 0; |
nargetdev | 19:fabe9521b0a1 | 40 | ButtonService *buttonServicePtr; |
nargetdev | 18:7c05ef6a639c | 41 | |
nargetdev | 19:fabe9521b0a1 | 42 | |
nargetdev | 21:3960e3b8ca7b | 43 | unsigned long seed = 151; |
dan | 0:7dec7e9ac085 | 44 | |
nargetdev | 9:1bd0f7a2ee71 | 45 | typedef unsigned char byte; |
nargetdev | 9:1bd0f7a2ee71 | 46 | typedef unsigned int uint; |
nargetdev | 9:1bd0f7a2ee71 | 47 | |
nargetdev | 18:7c05ef6a639c | 48 | #ifdef NRFDK |
nargetdev | 18:7c05ef6a639c | 49 | InterruptIn motion(p20); |
nargetdev | 18:7c05ef6a639c | 50 | PwmOut red(p21); |
nargetdev | 18:7c05ef6a639c | 51 | PwmOut green(p22); |
nargetdev | 18:7c05ef6a639c | 52 | PwmOut blue(p23); |
nargetdev | 18:7c05ef6a639c | 53 | #endif |
nargetdev | 18:7c05ef6a639c | 54 | |
nargetdev | 18:7c05ef6a639c | 55 | #ifdef MKIT |
nargetdev | 22:b618d55e9c9b | 56 | //PwmOut red(p18); |
nargetdev | 22:b618d55e9c9b | 57 | //PwmOut green(p19); |
nargetdev | 22:b618d55e9c9b | 58 | //PwmOut blue(p20); |
nargetdev | 22:b618d55e9c9b | 59 | PwmOut red(p6); |
nargetdev | 22:b618d55e9c9b | 60 | PwmOut green(p22); |
nargetdev | 22:b618d55e9c9b | 61 | PwmOut blue(p30); |
nargetdev | 18:7c05ef6a639c | 62 | InterruptIn motion(p1); |
nargetdev | 18:7c05ef6a639c | 63 | #endif |
nargetdev | 18:7c05ef6a639c | 64 | |
nargetdev | 19:fabe9521b0a1 | 65 | // get some randomness |
nargetdev | 19:fabe9521b0a1 | 66 | Timer t; |
nargetdev | 9:1bd0f7a2ee71 | 67 | |
nargetdev | 9:1bd0f7a2ee71 | 68 | Serial pc(USBTX, USBRX); // tx, rx |
nargetdev | 9:1bd0f7a2ee71 | 69 | |
nargetdev | 18:7c05ef6a639c | 70 | |
nargetdev | 18:7c05ef6a639c | 71 | BLEDevice ble; |
nargetdev | 18:7c05ef6a639c | 72 | |
nargetdev | 18:7c05ef6a639c | 73 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) |
nargetdev | 18:7c05ef6a639c | 74 | { |
nargetdev | 18:7c05ef6a639c | 75 | DEBUG("Disconnected!\n\r"); |
nargetdev | 18:7c05ef6a639c | 76 | DEBUG("Restarting the advertising process\n\r"); |
nargetdev | 18:7c05ef6a639c | 77 | ble.startAdvertising(); |
nargetdev | 18:7c05ef6a639c | 78 | } |
nargetdev | 18:7c05ef6a639c | 79 | |
nargetdev | 18:7c05ef6a639c | 80 | |
nargetdev | 18:7c05ef6a639c | 81 | |
nargetdev | 9:1bd0f7a2ee71 | 82 | unsigned int hash(unsigned int x) { |
nargetdev | 9:1bd0f7a2ee71 | 83 | x = ((x >> 16) ^ x) * 0x45d9f3b; |
nargetdev | 9:1bd0f7a2ee71 | 84 | x = ((x >> 16) ^ x) * 0x45d9f3b; |
nargetdev | 9:1bd0f7a2ee71 | 85 | x = ((x >> 16) ^ x); |
nargetdev | 9:1bd0f7a2ee71 | 86 | seed*=2; |
nargetdev | 9:1bd0f7a2ee71 | 87 | seed+=17; |
nargetdev | 9:1bd0f7a2ee71 | 88 | return x%100; |
dan | 0:7dec7e9ac085 | 89 | } |
nargetdev | 8:5ed23e276c8a | 90 | |
nargetdev | 21:3960e3b8ca7b | 91 | void zero_out() { |
nargetdev | 21:3960e3b8ca7b | 92 | red.write(0); |
nargetdev | 21:3960e3b8ca7b | 93 | green.write(0); |
nargetdev | 21:3960e3b8ca7b | 94 | blue.write(0); |
nargetdev | 21:3960e3b8ca7b | 95 | printf("zero_out()\r\n"); |
nargetdev | 21:3960e3b8ca7b | 96 | } |
nargetdev | 21:3960e3b8ca7b | 97 | |
nargetdev | 9:1bd0f7a2ee71 | 98 | void identify(unsigned int m){ |
nargetdev | 21:3960e3b8ca7b | 99 | DEBUG("IDENTIFYING as: "); |
nargetdev | 9:1bd0f7a2ee71 | 100 | unsigned int hashable; |
nargetdev | 9:1bd0f7a2ee71 | 101 | float write_me; |
nargetdev | 9:1bd0f7a2ee71 | 102 | |
nargetdev | 21:3960e3b8ca7b | 103 | int r, g, b; |
nargetdev | 21:3960e3b8ca7b | 104 | |
nargetdev | 9:1bd0f7a2ee71 | 105 | hashable = hash(m + seed); |
nargetdev | 9:1bd0f7a2ee71 | 106 | write_me = hashable/100.0; |
nargetdev | 21:3960e3b8ca7b | 107 | r = hashable >= 50; |
nargetdev | 21:3960e3b8ca7b | 108 | red.write(r); |
nargetdev | 9:1bd0f7a2ee71 | 109 | |
nargetdev | 9:1bd0f7a2ee71 | 110 | hashable = hash(m + seed); |
nargetdev | 9:1bd0f7a2ee71 | 111 | write_me = hashable/100.0; |
nargetdev | 21:3960e3b8ca7b | 112 | g = hashable >= 50; |
nargetdev | 21:3960e3b8ca7b | 113 | green.write(g); |
nargetdev | 9:1bd0f7a2ee71 | 114 | |
nargetdev | 9:1bd0f7a2ee71 | 115 | hashable = hash(m + seed); |
nargetdev | 9:1bd0f7a2ee71 | 116 | write_me = hashable/100.0; |
nargetdev | 21:3960e3b8ca7b | 117 | b = hashable >= 50; |
nargetdev | 21:3960e3b8ca7b | 118 | blue.write(b); |
nargetdev | 21:3960e3b8ca7b | 119 | |
nargetdev | 21:3960e3b8ca7b | 120 | char* STR; |
nargetdev | 21:3960e3b8ca7b | 121 | // sprintf(STR, "r, g, b: %f\t\r\n", write_me); |
nargetdev | 21:3960e3b8ca7b | 122 | // DEBUG(STR); |
nargetdev | 21:3960e3b8ca7b | 123 | DEBUG("%d%d%d\r\n",r,g,b); |
nargetdev | 8:5ed23e276c8a | 124 | } |
nargetdev | 8:5ed23e276c8a | 125 | |
nargetdev | 9:1bd0f7a2ee71 | 126 | void calibrate(){ |
nargetdev | 9:1bd0f7a2ee71 | 127 | |
nargetdev | 9:1bd0f7a2ee71 | 128 | //give the sensor some time to calibrate |
nargetdev | 21:3960e3b8ca7b | 129 | pc.printf("calibrating sensor\n\r"); |
nargetdev | 19:fabe9521b0a1 | 130 | for(int i = 0; i < CALIBRATION_TIME; i++){ |
nargetdev | 9:1bd0f7a2ee71 | 131 | pc.printf("."); |
nargetdev | 19:fabe9521b0a1 | 132 | identify(CALIBRATION_TIME); |
nargetdev | 15:ee94af1f90a0 | 133 | wait(.5); |
nargetdev | 9:1bd0f7a2ee71 | 134 | } |
nargetdev | 21:3960e3b8ca7b | 135 | DEBUG(" done\n\r"); |
nargetdev | 21:3960e3b8ca7b | 136 | zero_out(); |
nargetdev | 21:3960e3b8ca7b | 137 | |
nargetdev | 21:3960e3b8ca7b | 138 | DEBUG("SENSOR ACTIVE\n\r"); |
nargetdev | 9:1bd0f7a2ee71 | 139 | wait(0.05); |
nargetdev | 9:1bd0f7a2ee71 | 140 | } |
nargetdev | 9:1bd0f7a2ee71 | 141 | |
nargetdev | 19:fabe9521b0a1 | 142 | void motionIRQ(){ |
nargetdev | 19:fabe9521b0a1 | 143 | motionState = 1; |
nargetdev | 19:fabe9521b0a1 | 144 | } |
nargetdev | 10:fc61583e9e8f | 145 | |
nargetdev | 9:1bd0f7a2ee71 | 146 | |
nargetdev | 14:e8a1fe69b048 | 147 | |
nargetdev | 19:fabe9521b0a1 | 148 | |
nargetdev | 19:fabe9521b0a1 | 149 | |
nargetdev | 9:1bd0f7a2ee71 | 150 | int main() { |
nargetdev | 21:3960e3b8ca7b | 151 | DEBUG("Start Main.\r\n"); |
nargetdev | 21:3960e3b8ca7b | 152 | |
nargetdev | 19:fabe9521b0a1 | 153 | // Set RTC time to Wed, 28 Oct 2009 11:35:37 |
nargetdev | 19:fabe9521b0a1 | 154 | set_time(1256729737); |
nargetdev | 19:fabe9521b0a1 | 155 | t.start(); |
nargetdev | 18:7c05ef6a639c | 156 | red.period(0.01f); |
nargetdev | 18:7c05ef6a639c | 157 | green.period(0.01f); |
nargetdev | 18:7c05ef6a639c | 158 | blue.period(0.01f); |
nargetdev | 21:3960e3b8ca7b | 159 | |
nargetdev | 21:3960e3b8ca7b | 160 | |
nargetdev | 21:3960e3b8ca7b | 161 | calibrate(); |
nargetdev | 19:fabe9521b0a1 | 162 | |
nargetdev | 19:fabe9521b0a1 | 163 | ble.init(); |
nargetdev | 19:fabe9521b0a1 | 164 | ble.gap().onDisconnection(disconnectionCallback); |
nargetdev | 19:fabe9521b0a1 | 165 | |
nargetdev | 19:fabe9521b0a1 | 166 | ButtonService buttonService(ble, false /* initial value for button pressed */); |
nargetdev | 19:fabe9521b0a1 | 167 | buttonServicePtr = &buttonService; |
nargetdev | 19:fabe9521b0a1 | 168 | |
nargetdev | 19:fabe9521b0a1 | 169 | /* setup advertising */ |
nargetdev | 19:fabe9521b0a1 | 170 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
nargetdev | 19:fabe9521b0a1 | 171 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); |
nargetdev | 19:fabe9521b0a1 | 172 | ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
nargetdev | 19:fabe9521b0a1 | 173 | ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
nargetdev | 19:fabe9521b0a1 | 174 | ble.gap().setAdvertisingInterval(1000); /* 1000ms. */ |
nargetdev | 19:fabe9521b0a1 | 175 | ble.gap().startAdvertising(); |
nargetdev | 14:e8a1fe69b048 | 176 | |
nargetdev | 21:3960e3b8ca7b | 177 | DEBUG("Instantiate strip.\r\n"); |
nargetdev | 21:3960e3b8ca7b | 178 | Rgb strip; |
nargetdev | 21:3960e3b8ca7b | 179 | DEBUG("I have a strip.\r\n"); |
nargetdev | 18:7c05ef6a639c | 180 | |
nargetdev | 9:1bd0f7a2ee71 | 181 | while(1){ |
nargetdev | 18:7c05ef6a639c | 182 | #ifdef MKIT |
nargetdev | 19:fabe9521b0a1 | 183 | motion.rise(&motionIRQ); |
nargetdev | 19:fabe9521b0a1 | 184 | if (motionState){ |
nargetdev | 21:3960e3b8ca7b | 185 | pc.printf("Motion detected.\r\n"); |
nargetdev | 19:fabe9521b0a1 | 186 | buttonServicePtr->updateButtonState(motionState); |
nargetdev | 19:fabe9521b0a1 | 187 | strip.show(); |
nargetdev | 19:fabe9521b0a1 | 188 | motionState = 0; |
nargetdev | 19:fabe9521b0a1 | 189 | buttonServicePtr->updateButtonState(motionState); |
nargetdev | 19:fabe9521b0a1 | 190 | red.write(0.0f); |
nargetdev | 19:fabe9521b0a1 | 191 | green.write(0.0f); |
nargetdev | 19:fabe9521b0a1 | 192 | blue.write(0.0f); |
nargetdev | 19:fabe9521b0a1 | 193 | } |
nargetdev | 18:7c05ef6a639c | 194 | #endif |
nargetdev | 18:7c05ef6a639c | 195 | #ifdef NRFDK |
nargetdev | 19:fabe9521b0a1 | 196 | motion.fall(&strip.show()); |
nargetdev | 18:7c05ef6a639c | 197 | #endif |
nargetdev | 18:7c05ef6a639c | 198 | // red.write(0.0f); |
nargetdev | 18:7c05ef6a639c | 199 | // green.write(0.0f); |
nargetdev | 18:7c05ef6a639c | 200 | // blue.write(0.0f); |
nargetdev | 18:7c05ef6a639c | 201 | ble.waitForEvent(); |
nargetdev | 9:1bd0f7a2ee71 | 202 | } |
nargetdev | 8:5ed23e276c8a | 203 | } |