Light Show library for organic, calm, light display.

Dependencies:   BLE_API mbed nRF51822

Fork of mbed_blinky by Mbed

Committer:
nargetdev
Date:
Sat Jan 30 20:07:55 2016 +0000
Revision:
24:52319c0a14b8
Parent:
23:4bb74b53e112
Child:
25:d48f46d753fd
main test harness

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nargetdev 24:52319c0a14b8 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 #include "rgb_led.h"
nargetdev 23:4bb74b53e112 8
nargetdev 24:52319c0a14b8 9 #define MKIT
nargetdev 24:52319c0a14b8 10
nargetdev 24:52319c0a14b8 11 #ifdef NRFDK
nargetdev 24:52319c0a14b8 12 #define MOTION_PIN p20
nargetdev 24:52319c0a14b8 13
nargetdev 24:52319c0a14b8 14 #define RED_PIN p21
nargetdev 24:52319c0a14b8 15 #define GREEN_PIN p22
nargetdev 24:52319c0a14b8 16 #define BLUE_PIN p23
nargetdev 24:52319c0a14b8 17 #endif
nargetdev 24:52319c0a14b8 18
nargetdev 24:52319c0a14b8 19 #ifdef MKIT
nargetdev 24:52319c0a14b8 20 #define MOTION_PIN p1
nargetdev 24:52319c0a14b8 21
nargetdev 24:52319c0a14b8 22 #define RED_PIN p6
nargetdev 24:52319c0a14b8 23 #define GREEN_PIN p22
nargetdev 24:52319c0a14b8 24 #define BLUE_PIN p30
nargetdev 24:52319c0a14b8 25 #endif
nargetdev 24:52319c0a14b8 26
nargetdev 21:3960e3b8ca7b 27 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
nargetdev 24:52319c0a14b8 28 * it will have an impact on code-size and power consumption. */
nargetdev 11:2d3cc5459d5b 29
nargetdev 18:7c05ef6a639c 30 #if NEED_CONSOLE_OUTPUT
nargetdev 21:3960e3b8ca7b 31 #define DEBUG(...) { printf(__VA_ARGS__); }
nargetdev 18:7c05ef6a639c 32 #else
nargetdev 21:3960e3b8ca7b 33 #define DEBUG(STR) { if (uartServicePtr) uartServicePtr->write(STR, strlen(STR)); }
nargetdev 21:3960e3b8ca7b 34 //#else
nargetdev 21:3960e3b8ca7b 35 //#define DEBUG(...) /* nothing */
nargetdev 21:3960e3b8ca7b 36 #endif /* #if NEED_CONSOLE_OUxTPUT */
nargetdev 18:7c05ef6a639c 37
nargetdev 24:52319c0a14b8 38 Serial pc(USBTX, USBRX); // tx, rx
nargetdev 18:7c05ef6a639c 39
nargetdev 19:fabe9521b0a1 40 #define CALIBRATION_TIME 3
nargetdev 11:2d3cc5459d5b 41
nargetdev 24:52319c0a14b8 42
nargetdev 24:52319c0a14b8 43 Rgb strip(RED_PIN, GREEN_PIN, BLUE_PIN, &pc);
nargetdev 11:2d3cc5459d5b 44
nargetdev 19:fabe9521b0a1 45
nargetdev 19:fabe9521b0a1 46 //UARTService *uartServicePtr;
nargetdev 19:fabe9521b0a1 47 const static char DEVICE_NAME[] = "Bathroom";
nargetdev 19:fabe9521b0a1 48 static const uint16_t uuid16_list[] = {ButtonService::BUTTON_SERVICE_UUID};
nargetdev 18:7c05ef6a639c 49
nargetdev 19:fabe9521b0a1 50 uint8_t motionState = 0;
nargetdev 19:fabe9521b0a1 51 ButtonService *buttonServicePtr;
nargetdev 18:7c05ef6a639c 52
nargetdev 19:fabe9521b0a1 53
nargetdev 21:3960e3b8ca7b 54 unsigned long seed = 151;
dan 0:7dec7e9ac085 55
nargetdev 24:52319c0a14b8 56 typedef unsigned char byte;
nargetdev 24:52319c0a14b8 57 typedef unsigned int uint;
nargetdev 24:52319c0a14b8 58
nargetdev 24:52319c0a14b8 59
nargetdev 18:7c05ef6a639c 60
nargetdev 18:7c05ef6a639c 61
nargetdev 24:52319c0a14b8 62 InterruptIn motion(MOTION_PIN);
nargetdev 9:1bd0f7a2ee71 63
nargetdev 24:52319c0a14b8 64
nargetdev 9:1bd0f7a2ee71 65
nargetdev 18:7c05ef6a639c 66
nargetdev 18:7c05ef6a639c 67 BLEDevice ble;
nargetdev 18:7c05ef6a639c 68
nargetdev 18:7c05ef6a639c 69 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
nargetdev 18:7c05ef6a639c 70 {
nargetdev 18:7c05ef6a639c 71 DEBUG("Disconnected!\n\r");
nargetdev 18:7c05ef6a639c 72 DEBUG("Restarting the advertising process\n\r");
nargetdev 18:7c05ef6a639c 73 ble.startAdvertising();
nargetdev 18:7c05ef6a639c 74 }
nargetdev 18:7c05ef6a639c 75
nargetdev 18:7c05ef6a639c 76
nargetdev 18:7c05ef6a639c 77
nargetdev 24:52319c0a14b8 78 unsigned int hash(unsigned int x)
nargetdev 24:52319c0a14b8 79 {
nargetdev 9:1bd0f7a2ee71 80 x = ((x >> 16) ^ x) * 0x45d9f3b;
nargetdev 9:1bd0f7a2ee71 81 x = ((x >> 16) ^ x) * 0x45d9f3b;
nargetdev 9:1bd0f7a2ee71 82 x = ((x >> 16) ^ x);
nargetdev 9:1bd0f7a2ee71 83 seed*=2;
nargetdev 9:1bd0f7a2ee71 84 seed+=17;
nargetdev 9:1bd0f7a2ee71 85 return x%100;
dan 0:7dec7e9ac085 86 }
nargetdev 8:5ed23e276c8a 87
nargetdev 24:52319c0a14b8 88
nargetdev 21:3960e3b8ca7b 89
nargetdev 24:52319c0a14b8 90 void identify(unsigned int m)
nargetdev 24:52319c0a14b8 91 {
nargetdev 21:3960e3b8ca7b 92 DEBUG("IDENTIFYING as: ");
nargetdev 9:1bd0f7a2ee71 93 unsigned int hashable;
nargetdev 9:1bd0f7a2ee71 94 float write_me;
nargetdev 24:52319c0a14b8 95
nargetdev 21:3960e3b8ca7b 96 int r, g, b;
nargetdev 24:52319c0a14b8 97
nargetdev 9:1bd0f7a2ee71 98 hashable = hash(m + seed);
nargetdev 9:1bd0f7a2ee71 99 write_me = hashable/100.0;
nargetdev 21:3960e3b8ca7b 100 r = hashable >= 50;
nargetdev 24:52319c0a14b8 101 strip.write(RED, r);
nargetdev 9:1bd0f7a2ee71 102
nargetdev 9:1bd0f7a2ee71 103 hashable = hash(m + seed);
nargetdev 9:1bd0f7a2ee71 104 write_me = hashable/100.0;
nargetdev 21:3960e3b8ca7b 105 g = hashable >= 50;
nargetdev 24:52319c0a14b8 106 strip.write(GREEN, g);
nargetdev 24:52319c0a14b8 107
nargetdev 9:1bd0f7a2ee71 108 hashable = hash(m + seed);
nargetdev 9:1bd0f7a2ee71 109 write_me = hashable/100.0;
nargetdev 21:3960e3b8ca7b 110 b = hashable >= 50;
nargetdev 24:52319c0a14b8 111 strip.write(BLUE, b);
nargetdev 24:52319c0a14b8 112
nargetdev 21:3960e3b8ca7b 113 char* STR;
nargetdev 21:3960e3b8ca7b 114 // sprintf(STR, "r, g, b: %f\t\r\n", write_me);
nargetdev 21:3960e3b8ca7b 115 // DEBUG(STR);
nargetdev 21:3960e3b8ca7b 116 DEBUG("%d%d%d\r\n",r,g,b);
nargetdev 8:5ed23e276c8a 117 }
nargetdev 24:52319c0a14b8 118
nargetdev 24:52319c0a14b8 119 void calibrate()
nargetdev 24:52319c0a14b8 120 {
nargetdev 9:1bd0f7a2ee71 121
nargetdev 24:52319c0a14b8 122 //give the sensor some time to calibrate
nargetdev 24:52319c0a14b8 123 pc.printf("calibrating sensor\n\r");
nargetdev 24:52319c0a14b8 124 for(int i = 0; i < CALIBRATION_TIME; i++) {
nargetdev 24:52319c0a14b8 125 pc.printf(".");
nargetdev 24:52319c0a14b8 126 identify(CALIBRATION_TIME);
nargetdev 24:52319c0a14b8 127 wait(.5);
nargetdev 24:52319c0a14b8 128 }
nargetdev 21:3960e3b8ca7b 129 DEBUG(" done\n\r");
nargetdev 24:52319c0a14b8 130 strip.quiet();
nargetdev 21:3960e3b8ca7b 131
nargetdev 21:3960e3b8ca7b 132 DEBUG("SENSOR ACTIVE\n\r");
nargetdev 9:1bd0f7a2ee71 133 wait(0.05);
nargetdev 9:1bd0f7a2ee71 134 }
nargetdev 9:1bd0f7a2ee71 135
nargetdev 24:52319c0a14b8 136 void motionIRQ()
nargetdev 24:52319c0a14b8 137 {
nargetdev 19:fabe9521b0a1 138 motionState = 1;
nargetdev 19:fabe9521b0a1 139 }
nargetdev 10:fc61583e9e8f 140
nargetdev 9:1bd0f7a2ee71 141
nargetdev 14:e8a1fe69b048 142
nargetdev 24:52319c0a14b8 143 void show()
nargetdev 24:52319c0a14b8 144 {
nargetdev 24:52319c0a14b8 145 printf("show\r\n");
nargetdev 24:52319c0a14b8 146 // randomize the delay and scale values
nargetdev 24:52319c0a14b8 147 strip.randomize_params();
nargetdev 24:52319c0a14b8 148 printf("params initialized:\n\r");
nargetdev 24:52319c0a14b8 149 pc.printf("WAIT:\t%f\t%f\t%f\n\r", WAIT[0], WAIT[1], WAIT[2]);
nargetdev 24:52319c0a14b8 150 pc.printf("SCALE:\t%f\t%f\t%f\n\r", SCALE[0], SCALE[1], SCALE[2]);
nargetdev 24:52319c0a14b8 151 for (in = 0; in < hysteresis || rgb != 0x7; in = in + INCREMENT) {
nargetdev 24:52319c0a14b8 152 #ifdef MKIT
nargetdev 24:52319c0a14b8 153 bool mov = motion;
nargetdev 24:52319c0a14b8 154 #else
nargetdev 24:52319c0a14b8 155 bool mov = !motion;
nargetdev 24:52319c0a14b8 156 #endif
nargetdev 24:52319c0a14b8 157 if (mov) {
nargetdev 24:52319c0a14b8 158 strip.hysteresis = in + HYSTERESIS_QUANTITY;
nargetdev 24:52319c0a14b8 159 }
nargetdev 24:52319c0a14b8 160
nargetdev 24:52319c0a14b8 161 // update rgb
nargetdev 24:52319c0a14b8 162 strip.update_rgb_values();
nargetdev 24:52319c0a14b8 163
nargetdev 24:52319c0a14b8 164 // write values
nargetdev 24:52319c0a14b8 165 strip.write_rgb();
nargetdev 24:52319c0a14b8 166
nargetdev 24:52319c0a14b8 167
nargetdev 24:52319c0a14b8 168 if (in > hysteresis) {
nargetdev 24:52319c0a14b8 169 if (rgb_c[0] < 0.01)
nargetdev 24:52319c0a14b8 170 rgb |= 0x1;
nargetdev 24:52319c0a14b8 171 if (rgb_c[1] < 0.01)
nargetdev 24:52319c0a14b8 172 rgb |= 0x2;
nargetdev 24:52319c0a14b8 173 if (rgb_c[2] < 0.01)
nargetdev 24:52319c0a14b8 174 rgb |= 0x4;
nargetdev 24:52319c0a14b8 175 }
nargetdev 24:52319c0a14b8 176 }
nargetdev 24:52319c0a14b8 177 }
nargetdev 24:52319c0a14b8 178
nargetdev 24:52319c0a14b8 179
nargetdev 24:52319c0a14b8 180
nargetdev 19:fabe9521b0a1 181
nargetdev 24:52319c0a14b8 182 int main()
nargetdev 24:52319c0a14b8 183 {
nargetdev 21:3960e3b8ca7b 184 DEBUG("Start Main.\r\n");
nargetdev 24:52319c0a14b8 185
nargetdev 21:3960e3b8ca7b 186
nargetdev 21:3960e3b8ca7b 187
nargetdev 21:3960e3b8ca7b 188 calibrate();
nargetdev 19:fabe9521b0a1 189
nargetdev 19:fabe9521b0a1 190 ble.init();
nargetdev 19:fabe9521b0a1 191 ble.gap().onDisconnection(disconnectionCallback);
nargetdev 19:fabe9521b0a1 192
nargetdev 19:fabe9521b0a1 193 ButtonService buttonService(ble, false /* initial value for button pressed */);
nargetdev 19:fabe9521b0a1 194 buttonServicePtr = &buttonService;
nargetdev 19:fabe9521b0a1 195
nargetdev 19:fabe9521b0a1 196 /* setup advertising */
nargetdev 19:fabe9521b0a1 197 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
nargetdev 19:fabe9521b0a1 198 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list));
nargetdev 19:fabe9521b0a1 199 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
nargetdev 19:fabe9521b0a1 200 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
nargetdev 19:fabe9521b0a1 201 ble.gap().setAdvertisingInterval(1000); /* 1000ms. */
nargetdev 19:fabe9521b0a1 202 ble.gap().startAdvertising();
nargetdev 24:52319c0a14b8 203
nargetdev 18:7c05ef6a639c 204
nargetdev 24:52319c0a14b8 205
nargetdev 24:52319c0a14b8 206 while(1) {
nargetdev 18:7c05ef6a639c 207 #ifdef MKIT
nargetdev 19:fabe9521b0a1 208 motion.rise(&motionIRQ);
nargetdev 24:52319c0a14b8 209 if (motionState) {
nargetdev 21:3960e3b8ca7b 210 pc.printf("Motion detected.\r\n");
nargetdev 19:fabe9521b0a1 211 buttonServicePtr->updateButtonState(motionState);
nargetdev 24:52319c0a14b8 212 show();
nargetdev 19:fabe9521b0a1 213 motionState = 0;
nargetdev 19:fabe9521b0a1 214 buttonServicePtr->updateButtonState(motionState);
nargetdev 24:52319c0a14b8 215 strip.quiet();
nargetdev 19:fabe9521b0a1 216 }
nargetdev 18:7c05ef6a639c 217 #endif
nargetdev 18:7c05ef6a639c 218 #ifdef NRFDK
nargetdev 19:fabe9521b0a1 219 motion.fall(&strip.show());
nargetdev 18:7c05ef6a639c 220 #endif
nargetdev 24:52319c0a14b8 221
nargetdev 18:7c05ef6a639c 222 ble.waitForEvent();
nargetdev 9:1bd0f7a2ee71 223 }
nargetdev 8:5ed23e276c8a 224 }