Lizzy project

Dependencies:   aconno_I2C Lis2dh12 adc52832_common aconno_SEGGER_RTT

Committer:
jurica238814
Date:
Thu Jan 31 15:50:52 2019 +0100
Branch:
master
Revision:
29:b021b33cf666
Parent:
26:6101bb09f70d
Scaling factor hardcoded for acnSENSA format

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dbartolovic 8:7ba4f82de9b6 1 #include "main.h"
dbartolovic 24:7539258b015c 2 #include "bsp.h"
dbartolovic 8:7ba4f82de9b6 3 #include "bsp_buzz.h"
dbartolovic 8:7ba4f82de9b6 4 #include "bsp_led.h"
dbartolovic 8:7ba4f82de9b6 5 #include "aconno_ble.h"
dbartolovic 8:7ba4f82de9b6 6 #include "tasks.h"
dbartolovic 8:7ba4f82de9b6 7 #include "GapAdvertisingData.h"
dbartolovic 8:7ba4f82de9b6 8
dbartolovic 8:7ba4f82de9b6 9
dbartolovic 8:7ba4f82de9b6 10 DigitalOut redLed(RED_LED_PIN);
dbartolovic 8:7ba4f82de9b6 11 #if NANO_MODULE == 0
dbartolovic 8:7ba4f82de9b6 12 DigitalOut greenLed(GREEN_LED_PIN);
dbartolovic 8:7ba4f82de9b6 13 DigitalOut blueLed(BLUE_LED_PIN);
dbartolovic 8:7ba4f82de9b6 14 #endif
dbartolovic 8:7ba4f82de9b6 15
dbartolovic 24:7539258b015c 16 extern Lis2dh12 mems;
dbartolovic 24:7539258b015c 17 extern InterruptIn INT1;
dbartolovic 24:7539258b015c 18
dbartolovic 8:7ba4f82de9b6 19 Buzz buzzer(NRF_PWM2, BUZZER_PIN);
dbartolovic 8:7ba4f82de9b6 20
dbartolovic 8:7ba4f82de9b6 21 static advertising_packet advertisementPacket;
dbartolovic 8:7ba4f82de9b6 22 static GapAdvertisingData adv_data = GapAdvertisingData();
dbartolovic 8:7ba4f82de9b6 23
dbartolovic 8:7ba4f82de9b6 24
dbartolovic 8:7ba4f82de9b6 25 #if TEST_LEDS_BUZZ
dbartolovic 8:7ba4f82de9b6 26 Ticker test_ticker;
dbartolovic 8:7ba4f82de9b6 27 #endif
dbartolovic 8:7ba4f82de9b6 28
dbartolovic 24:7539258b015c 29 LowPowerTicker longDelaysT;
dbartolovic 24:7539258b015c 30
dbartolovic 24:7539258b015c 31
dbartolovic 24:7539258b015c 32 inline void startLongDelay(uint32_t delay)
dbartolovic 24:7539258b015c 33 {
dbartolovic 24:7539258b015c 34 longDelaysT.attach(longDelaysC, delay);
dbartolovic 24:7539258b015c 35 }
dbartolovic 24:7539258b015c 36
dbartolovic 24:7539258b015c 37 inline void stopLongDelay()
dbartolovic 24:7539258b015c 38 {
dbartolovic 24:7539258b015c 39 longDelaysT.detach();
dbartolovic 24:7539258b015c 40 }
dbartolovic 24:7539258b015c 41
dbartolovic 8:7ba4f82de9b6 42
dbartolovic 8:7ba4f82de9b6 43 void tasks_init()
dbartolovic 8:7ba4f82de9b6 44 {
dbartolovic 8:7ba4f82de9b6 45 redLed = 1;
dbartolovic 8:7ba4f82de9b6 46 greenLed = 1;
dbartolovic 8:7ba4f82de9b6 47 blueLed = 1;
dbartolovic 8:7ba4f82de9b6 48
dbartolovic 8:7ba4f82de9b6 49 #if TEST_LEDS_BUZZ
dbartolovic 8:7ba4f82de9b6 50 test_ticker.attach(led_tick, 0.5);
dbartolovic 8:7ba4f82de9b6 51 #endif
dbartolovic 8:7ba4f82de9b6 52 }
dbartolovic 8:7ba4f82de9b6 53
dbartolovic 8:7ba4f82de9b6 54 #if TEST_LEDS_BUZZ
dbartolovic 8:7ba4f82de9b6 55 void buzz_tick()
dbartolovic 8:7ba4f82de9b6 56 {
dbartolovic 8:7ba4f82de9b6 57 static int start = 1;
dbartolovic 8:7ba4f82de9b6 58
dbartolovic 8:7ba4f82de9b6 59 if (start)
dbartolovic 8:7ba4f82de9b6 60 {
dbartolovic 8:7ba4f82de9b6 61 buzzer.enable();
dbartolovic 8:7ba4f82de9b6 62 start = 0;
dbartolovic 8:7ba4f82de9b6 63 }
dbartolovic 8:7ba4f82de9b6 64 else
dbartolovic 8:7ba4f82de9b6 65 {
dbartolovic 8:7ba4f82de9b6 66 buzzer.disable();
dbartolovic 8:7ba4f82de9b6 67 start = 1;
dbartolovic 8:7ba4f82de9b6 68 led_tick();
dbartolovic 8:7ba4f82de9b6 69 test_ticker.detach();
dbartolovic 8:7ba4f82de9b6 70 test_ticker.attach(led_tick, 0.5);
dbartolovic 8:7ba4f82de9b6 71 }
dbartolovic 8:7ba4f82de9b6 72 }
dbartolovic 8:7ba4f82de9b6 73
dbartolovic 8:7ba4f82de9b6 74 void led_tick()
dbartolovic 8:7ba4f82de9b6 75 {
dbartolovic 8:7ba4f82de9b6 76 static int count = 0;
dbartolovic 8:7ba4f82de9b6 77
dbartolovic 8:7ba4f82de9b6 78 switch(count)
dbartolovic 8:7ba4f82de9b6 79 {
dbartolovic 8:7ba4f82de9b6 80 case 0:
dbartolovic 8:7ba4f82de9b6 81 redLed = 0;
dbartolovic 8:7ba4f82de9b6 82 break;
dbartolovic 8:7ba4f82de9b6 83
dbartolovic 8:7ba4f82de9b6 84 case 1:
dbartolovic 8:7ba4f82de9b6 85 redLed = 1;
dbartolovic 8:7ba4f82de9b6 86 greenLed = 0;
dbartolovic 8:7ba4f82de9b6 87 break;
dbartolovic 8:7ba4f82de9b6 88
dbartolovic 8:7ba4f82de9b6 89 case 2:
dbartolovic 8:7ba4f82de9b6 90 greenLed = 1;
dbartolovic 8:7ba4f82de9b6 91 blueLed = 0;
dbartolovic 8:7ba4f82de9b6 92 break;
dbartolovic 8:7ba4f82de9b6 93
dbartolovic 8:7ba4f82de9b6 94 default:
dbartolovic 8:7ba4f82de9b6 95 blueLed = 1;
dbartolovic 8:7ba4f82de9b6 96 count = -1;
dbartolovic 8:7ba4f82de9b6 97 buzz_tick();
dbartolovic 8:7ba4f82de9b6 98 test_ticker.detach();
dbartolovic 8:7ba4f82de9b6 99 test_ticker.attach(buzz_tick, BUZZ_TIME_S);
dbartolovic 8:7ba4f82de9b6 100 }
dbartolovic 8:7ba4f82de9b6 101
dbartolovic 8:7ba4f82de9b6 102 count++;
dbartolovic 8:7ba4f82de9b6 103 }
dbartolovic 8:7ba4f82de9b6 104 #endif
dbartolovic 8:7ba4f82de9b6 105
dbartolovic 8:7ba4f82de9b6 106 void measureF(Lis2dh12 *mems)
dbartolovic 8:7ba4f82de9b6 107 {
dbartolovic 24:7539258b015c 108 int untilSleep;
dbartolovic 24:7539258b015c 109
dbartolovic 15:c0c01188a29b 110 while(1)
dbartolovic 8:7ba4f82de9b6 111 {
dbartolovic 15:c0c01188a29b 112 Thread::signal_wait(START_MEAS);
dbartolovic 15:c0c01188a29b 113 Thread::signal_clr(START_MEAS);
dbartolovic 15:c0c01188a29b 114
dbartolovic 24:7539258b015c 115 INT1.disable_irq();
dbartolovic 24:7539258b015c 116
dbartolovic 24:7539258b015c 117 untilSleep = ACTIVE_PERIOD_MS / MEASURE_INTERVAL_MS;
dbartolovic 24:7539258b015c 118
dbartolovic 15:c0c01188a29b 119 BLE::Instance().startAdvertising();
dbartolovic 8:7ba4f82de9b6 120
dbartolovic 15:c0c01188a29b 121 while (1)
dbartolovic 15:c0c01188a29b 122 {
dbartolovic 15:c0c01188a29b 123 advertisementPacket.header = APPLICATION_ID;
dbartolovic 15:c0c01188a29b 124 advertisementPacket.type = 0x00;
dbartolovic 15:c0c01188a29b 125 advertisementPacket.gyroscope[0] = (int16_t)0;
dbartolovic 15:c0c01188a29b 126 advertisementPacket.gyroscope[1] = (int16_t)0;
dbartolovic 15:c0c01188a29b 127 advertisementPacket.gyroscope[2] = (int16_t)0;
dbartolovic 15:c0c01188a29b 128 advertisementPacket.magnetometer[0] = (int16_t)0;
dbartolovic 15:c0c01188a29b 129 advertisementPacket.magnetometer[1] = (int16_t)0;
dbartolovic 15:c0c01188a29b 130 advertisementPacket.magnetometer[2] = (int16_t)0;
dbartolovic 15:c0c01188a29b 131
dbartolovic 15:c0c01188a29b 132 #if NORMAL_AXIS == 1
dbartolovic 15:c0c01188a29b 133 advertisementPacket.accelerometer[0] = (int16_t)mems->readXAxis();
dbartolovic 15:c0c01188a29b 134 advertisementPacket.accelerometer[1] = (int16_t)mems->readYAxis();
dbartolovic 15:c0c01188a29b 135 advertisementPacket.accelerometer[2] = (int16_t)mems->readZAxis();
dbartolovic 15:c0c01188a29b 136 #else
dbartolovic 15:c0c01188a29b 137 advertisementPacket.accelerometer[0] = -(int16_t)mems->readYAxis();
dbartolovic 15:c0c01188a29b 138 advertisementPacket.accelerometer[1] = (int16_t)mems->readXAxis();
dbartolovic 15:c0c01188a29b 139 advertisementPacket.accelerometer[2] = (int16_t)mems->readZAxis();
dbartolovic 15:c0c01188a29b 140 #endif
jurica238814 29:b021b33cf666 141 advertisementPacket.accelerometer[0] *= 60;
jurica238814 29:b021b33cf666 142 advertisementPacket.accelerometer[1] *= 60;
jurica238814 29:b021b33cf666 143 advertisementPacket.accelerometer[2] *= 60;
dbartolovic 15:c0c01188a29b 144
jurica238814 29:b021b33cf666 145 printf("X: %d", advertisementPacket.accelerometer[0]);
jurica238814 29:b021b33cf666 146 printf("\tY: %d", advertisementPacket.accelerometer[1]);
jurica238814 29:b021b33cf666 147 printf("\tZ: %d\n", advertisementPacket.accelerometer[2]);
jurica238814 29:b021b33cf666 148
dbartolovic 15:c0c01188a29b 149 advertisementPacket.acc_lsb_value = LSB_VALUE;
dbartolovic 15:c0c01188a29b 150
dbartolovic 15:c0c01188a29b 151 updateServiceT.signal_set(MEAS_DONE);
dbartolovic 15:c0c01188a29b 152 bleT.signal_set(MEAS_DONE);
dbartolovic 15:c0c01188a29b 153
dbartolovic 23:bf9c1dd2b5cb 154 wait_ms(MEASURE_INTERVAL_MS);
dbartolovic 15:c0c01188a29b 155 untilSleep--;
dbartolovic 15:c0c01188a29b 156
dbartolovic 16:482d8f81d6f3 157 if( (untilSleep <= 0) && !bleIsClientConnected() )
dbartolovic 15:c0c01188a29b 158 {
dbartolovic 15:c0c01188a29b 159 BLE::Instance().stopAdvertising();
dbartolovic 24:7539258b015c 160 startLongDelay(LONG_SLEEP_S);
dbartolovic 15:c0c01188a29b 161 break;
dbartolovic 15:c0c01188a29b 162 }
dbartolovic 15:c0c01188a29b 163 }
dbartolovic 8:7ba4f82de9b6 164 }
dbartolovic 8:7ba4f82de9b6 165 }
dbartolovic 8:7ba4f82de9b6 166
dbartolovic 8:7ba4f82de9b6 167 void updateServiceF()
dbartolovic 8:7ba4f82de9b6 168 {
dbartolovic 8:7ba4f82de9b6 169 while (1)
dbartolovic 8:7ba4f82de9b6 170 {
dbartolovic 8:7ba4f82de9b6 171 Thread::signal_wait(MEAS_DONE);
dbartolovic 8:7ba4f82de9b6 172 updateServiceT.signal_clr(MEAS_DONE);
dbartolovic 8:7ba4f82de9b6 173
dbartolovic 8:7ba4f82de9b6 174 lizzy_service->set_acc_data(advertisementPacket.accelerometer);
dbartolovic 8:7ba4f82de9b6 175 }
dbartolovic 8:7ba4f82de9b6 176 }
dbartolovic 8:7ba4f82de9b6 177
dbartolovic 8:7ba4f82de9b6 178 void updateBuzzLedsF()
dbartolovic 8:7ba4f82de9b6 179 {
dbartolovic 26:6101bb09f70d 180 #if VODAFONE_COMPATIBILITY == 1
dbartolovic 26:6101bb09f70d 181 const uint8_t startBuzz = 0xBA;
dbartolovic 26:6101bb09f70d 182 #endif
dbartolovic 26:6101bb09f70d 183
dbartolovic 8:7ba4f82de9b6 184 while (1)
dbartolovic 8:7ba4f82de9b6 185 {
dbartolovic 8:7ba4f82de9b6 186 Thread::signal_wait(UPDATE_BUZZ_LEDS);
dbartolovic 8:7ba4f82de9b6 187 updateBuzzLedsT.signal_clr(UPDATE_BUZZ_LEDS);
dbartolovic 26:6101bb09f70d 188
dbartolovic 26:6101bb09f70d 189 #if VODAFONE_COMPATIBILITY == 1
dbartolovic 26:6101bb09f70d 190 uint8_t tmpBuzzState[4];
dbartolovic 26:6101bb09f70d 191 if( buzzer.get_state() !=
dbartolovic 26:6101bb09f70d 192 (lizzy_service->getBuzz(tmpBuzzState)[0] == startBuzz) )
dbartolovic 26:6101bb09f70d 193 #else
dbartolovic 26:6101bb09f70d 194 if( buzzer.get_state() != (lizzy_service->getBuzz()) )
dbartolovic 26:6101bb09f70d 195 #endif
dbartolovic 8:7ba4f82de9b6 196 {
dbartolovic 26:6101bb09f70d 197 #if VODAFONE_COMPATIBILITY == 1
dbartolovic 26:6101bb09f70d 198 if( tmpBuzzState[0] == startBuzz )
dbartolovic 26:6101bb09f70d 199 #else
dbartolovic 26:6101bb09f70d 200 if( lizzy_service->getBuzz() )
dbartolovic 26:6101bb09f70d 201 #endif
dbartolovic 8:7ba4f82de9b6 202 buzzer.enable();
dbartolovic 8:7ba4f82de9b6 203 else
dbartolovic 8:7ba4f82de9b6 204 buzzer.disable();
dbartolovic 8:7ba4f82de9b6 205 }
dbartolovic 26:6101bb09f70d 206 #if VODAFONE_COMPATIBILITY == 1
dbartolovic 26:6101bb09f70d 207 #else
dbartolovic 26:6101bb09f70d 208 if( !redLed != (lizzy_service->getRedLed()) )
dbartolovic 8:7ba4f82de9b6 209 {
dbartolovic 26:6101bb09f70d 210 redLed = !(lizzy_service->getRedLed());
dbartolovic 8:7ba4f82de9b6 211 }
dbartolovic 26:6101bb09f70d 212 #endif
dbartolovic 26:6101bb09f70d 213 if( !greenLed != (lizzy_service->get_green_state()) )
dbartolovic 8:7ba4f82de9b6 214 {
dbartolovic 8:7ba4f82de9b6 215 greenLed = !(lizzy_service->get_green_state());
dbartolovic 8:7ba4f82de9b6 216 }
dbartolovic 26:6101bb09f70d 217 if( !blueLed != (lizzy_service->get_blue_state()) )
dbartolovic 8:7ba4f82de9b6 218 {
dbartolovic 8:7ba4f82de9b6 219 blueLed = !(lizzy_service->get_blue_state());
dbartolovic 8:7ba4f82de9b6 220 }
dbartolovic 8:7ba4f82de9b6 221 }
dbartolovic 8:7ba4f82de9b6 222 }
dbartolovic 8:7ba4f82de9b6 223
dbartolovic 8:7ba4f82de9b6 224 void bleF(BLE *ble)
dbartolovic 8:7ba4f82de9b6 225 {
dbartolovic 8:7ba4f82de9b6 226 while(true)
dbartolovic 8:7ba4f82de9b6 227 {
dbartolovic 8:7ba4f82de9b6 228 Thread::signal_wait(MEAS_DONE);
dbartolovic 8:7ba4f82de9b6 229 bleT.signal_clr(MEAS_DONE);
dbartolovic 8:7ba4f82de9b6 230
dbartolovic 26:6101bb09f70d 231 #if VODAFONE_COMPATIBILITY == 1
dbartolovic 26:6101bb09f70d 232 #else
dbartolovic 8:7ba4f82de9b6 233 adv_data = ble->getAdvertisingData();
dbartolovic 8:7ba4f82de9b6 234 adv_data.updateData(adv_data.MANUFACTURER_SPECIFIC_DATA, (uint8_t *)&advertisementPacket, sizeof(advertisementPacket));
dbartolovic 8:7ba4f82de9b6 235 ble->setAdvertisingData(adv_data);
dbartolovic 26:6101bb09f70d 236 #endif
dbartolovic 26:6101bb09f70d 237
dbartolovic 8:7ba4f82de9b6 238 }
dbartolovic 16:482d8f81d6f3 239 }
dbartolovic 16:482d8f81d6f3 240
dbartolovic 16:482d8f81d6f3 241 void servLoopC(void)
dbartolovic 16:482d8f81d6f3 242 {
dbartolovic 16:482d8f81d6f3 243 while(1)
dbartolovic 16:482d8f81d6f3 244 {
dbartolovic 16:482d8f81d6f3 245 getBLEEventQueue()->dispatch_forever();
dbartolovic 16:482d8f81d6f3 246 Thread::wait(0xFFFFFFFF);
dbartolovic 16:482d8f81d6f3 247 }
dbartolovic 24:7539258b015c 248 }
dbartolovic 24:7539258b015c 249
dbartolovic 24:7539258b015c 250 void longDelaysC(void)
dbartolovic 24:7539258b015c 251 {
dbartolovic 24:7539258b015c 252 mems.clearIntFlag();
dbartolovic 24:7539258b015c 253
dbartolovic 24:7539258b015c 254 INT1.enable_irq();
dbartolovic 24:7539258b015c 255
dbartolovic 24:7539258b015c 256 stopLongDelay();
dbartolovic 8:7ba4f82de9b6 257 }