Geo beacon for VF.
Dependencies: MMA8452 aconno_bsp adc52832_common
Diff: main.cpp
- Revision:
- 20:d534b9c18482
- Parent:
- 19:abf14a5ada93
--- a/main.cpp Tue Aug 22 07:35:03 2017 +0000 +++ b/main.cpp Mon Aug 28 07:06:20 2017 +0000 @@ -16,14 +16,14 @@ #define DEBUG (0) #define DEBUG_ACC (0) -#define PRINT (0) +#define PRINT (1) #define DEBUG_MAC (0) #define DEBUG_CONNECTION (0) #define USE_ACC (0) -#define SLEEP_TIME_S (3.0) /* Sleep time (in s) */ -#define ADV_TIMER_TIME_S (3.0) /* Advertising time (in s) */ -#define SCAN_TIMER_TIME_S (1.0) /* Scanning time (in s) */ +#define SLEEP_TIME_S (5.0) /* Sleep time (in s) */ +#define ADV_TIMER_TIME_S (0.5) /* Advertising time (in s) */ +#define SCAN_TIMER_TIME_S (0.5) /* Scanning time (in s) */ #define FREE_TIME_S (0.1) /* Time between end of a scanning and sleep mode */ #define AWAKE_TIME_S (ADV_TIMER_TIME_S+SCAN_TIMER_TIME_S+FREE_TIME_S) /* Was 0.15 */ #define SHORT_SLEEP_TIME_S (0.5) /* Shorter sleep time (s) */ @@ -50,10 +50,12 @@ #if PRINT /* Defines for debugging over uart */ - #define TX (p25) - #define RX (p26) - NRF52_UART uart(TX,RX, Baud9600); - char printBuffer[30] = {}; + #define TX (p29) + #define RX (p30) + NRF52_UART serial(TX,RX, Baud9600); + char buffer[255] = {0}; + uint8_t buffer_s; + int printBufferLen; #endif @@ -61,7 +63,7 @@ bool shushShush = false; const static uint16_t ACK_CHARA_UUID = 0xA001; -uint8_t txPower = 4; +int8_t txPower = 4; uint8_t sleepFlag = false; uint8_t tempSleepTime = SLEEP_TIME_S; uint8_t msd[MSD_SIZE] = {0x59, 0x00, 0xE1, 0x61, 0x35, 0xBA, 0xC0, 0xEC, 0x47, 0x2A, 0x98, 0x00, 0xAF, 0x18, 0x43, 0xFF, 0x05, 0x00}; @@ -76,21 +78,21 @@ enum RadioState radioState = OFF; void TurnBuzzOff(void); -void GoToSleep(); +void goToSleep(); void StartAdvertising(); void startScanning(); void WakeMeUp(); Ticker WakeSleepT; -Ticker turnBuzzOffT; -Ticker sleepChanger; -PwmOut buzzer(BUZZER); +//Ticker turnBuzzOffT; +//Ticker sleepChanger; +//PwmOut buzzer(BUZZER); +//DigitalOut accPower(p7); +//DigitalOut i2cPower(p5); #if USE_ACC - DigitalOut accPower(p7); - DigitalOut i2cPower(p5); InterruptIn accPulse(INT2_PIN); + Acc_MMA8452 acc(I2C_DATA, I2C_CLK, MMA8452_ADDRESS); #endif -Acc_MMA8452 acc(I2C_DATA, I2C_CLK, MMA8452_ADDRESS); BLE &ble = BLE::Instance(); ACKService<4> *ackServicePtr; @@ -104,7 +106,6 @@ DigitalOut int_led(p22); #endif - void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params){ #if DEBUG_CONNECTION @@ -166,11 +167,11 @@ connectedLED = 1; wait_ms(100); #endif - buzzer.period(0.0009F); - buzzer.write(0.5F); + //buzzer.period(0.0009F); + //buzzer.write(0.5F); WakeSleepT.detach(); - turnBuzzOffT.detach(); - turnBuzzOffT.attach(TurnBuzzOff, BUZZ_TIME_S); + //turnBuzzOffT.detach(); + //turnBuzzOffT.attach(TurnBuzzOff, BUZZ_TIME_S); /* This function should make advertiser stop */ @@ -227,7 +228,6 @@ ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)msd, MSD_SIZE); ble.gap().setAdvertisingInterval(ADV_INTERVAL); // --> Has to be at least 100ms! //ble.gap().startAdvertising(); - } @@ -306,12 +306,12 @@ if ((params->advertisingData[msdOffset+1]) == 0x59){ if ((params->advertisingData[msdOffset+2]) == 0x00){ if(CheckMac(params, myMacAddress, msdOffset)){ - //ble.gap().stopScan(); - buzzer.period(0.0009F); - buzzer.write(0.5F); + ble.gap().stopScan(); + //buzzer.period(0.0009F); + //buzzer.write(0.5F); WakeSleepT.detach(); - turnBuzzOffT.detach(); - turnBuzzOffT.attach(TurnBuzzOff, BUZZ_TIME_S); + //turnBuzzOffT.detach(); + //turnBuzzOffT.attach(TurnBuzzOff, BUZZ_TIME_S); } } } @@ -322,7 +322,7 @@ /* Call this function few minutes (TBD) after a last scanned advertisment */ void changeSleepTime(){ tempSleepTime = SLEEP_TIME_S; - sleepChanger.detach(); + //sleepChanger.detach(); } @@ -330,20 +330,16 @@ * The function is called when ticker generates interrupt */ void TurnBuzzOff(void){ - buzzer.period(0.00F); - buzzer.write(0.0F); - NRF_PWM0->TASKS_STOP = 1; - NRF_PWM1->TASKS_STOP = 1; - NRF_PWM2->TASKS_STOP = 1; + //buzzer.period(0.00F); + //buzzer.write(0.0F); tempSleepTime = SHORT_SLEEP_TIME_S; - turnBuzzOffT.detach(); + //turnBuzzOffT.detach(); WakeSleepT.detach(); - sleepChanger.attach(changeSleepTime, SHORT_SLEEP_TIME_PERIOD_S); + //sleepChanger.attach(changeSleepTime, SHORT_SLEEP_TIME_PERIOD_S); WakeSleepT.attach(WakeMeUp, FREE_TIME_S); } void startAdvertising(){ - NRF_PWM0->TASKS_SEQSTART[0] = 1; #if USE_ACC i2cPower = 1; #endif @@ -357,11 +353,8 @@ } else{ ble.gap().startAdvertising(); - buzzer.period(0.00F); - buzzer.write(0.0F); - NRF_PWM0->TASKS_STOP = 1; - NRF_PWM1->TASKS_STOP = 1; - NRF_PWM2->TASKS_STOP = 1; + //buzzer.period(0.00F); + //buzzer.write(0.0F); #if DEBUG advLED = 0; scanLED = 1; @@ -376,11 +369,8 @@ ble.gap().setScanParams(SCAN_INTERVAL, SCAN_WINDOW); ble.gap().setScanTimeout(SCAN_TIMER_TIME_S); ble.gap().startScan(advertisementCallback); - buzzer.period(0.00F); - buzzer.write(0.0F); - NRF_PWM0->TASKS_STOP = 1; - NRF_PWM1->TASKS_STOP = 1; - NRF_PWM2->TASKS_STOP = 1; + //buzzer.period(0.00F); + //buzzer.write(0.0F); #if DEBUG advLED = 1; scanLED = 0; @@ -405,22 +395,21 @@ case SCANNING:{ radioState = OFF; WakeSleepT.detach(); - //WakeSleepT.attach(GoToSleep, FREE_TIME_S); - GoToSleep(); + WakeSleepT.attach(goToSleep, FREE_TIME_S); + goToSleep(); break; } default: return; } } -void GoToSleep(){ - buzzer.period(0.00F); - buzzer.write(0.0f); - NRF_PWM0->TASKS_STOP = 1; - NRF_PWM1->TASKS_STOP = 1; - NRF_PWM2->TASKS_STOP = 1; +void goToSleep(){ + //buzzer.period(0.00F); + //buzzer.write(0.0f); + printBufferLen = sprintf(buffer, "In goToSleep...\r\n"); + serial.send(buffer, printBufferLen); WakeSleepT.detach(); - WakeSleepT.attach(WakeMeUp, tempSleepTime); + WakeSleepT.attach(goToSleep, tempSleepTime); ble.gap().stopAdvertising(); ble.gap().stopScan(); sleepFlag = 1; @@ -435,37 +424,31 @@ #if DEBUG_ACC int_led = !int_led; #endif - buzzer.period(0.0009F); - buzzer.write(0.5f); + //buzzer.period(0.0009F); + //buzzer.write(0.5f); } #endif -int main(void){ +int main(void){ #if DEBUG || DEBUG_MAC advLED = 1; scanLED = 1; connectedLED = 1; #endif - buzzer.period(0.0009F); - buzzer.write(0.0F); + //buzzer.period(0.0009F); + //buzzer.write(0.0F); + + #if !USE_ACC + //accPower = 0; + //i2cPower = 0; + #endif + #if USE_ACC accPower = 1; i2cPower = 1; #endif - #if PRINT - int i; - for(i=0; i<10; i++){ - printBuffer[0] = 'B'; - printBuffer[1] = 'o'; - printBuffer[2] = 'k'; - uart.send(printBuffer, 3); - wait_ms(100); - } - #endif - - WakeSleepT.attach(GoToSleep, AWAKE_TIME_S); ble.init(bleInitComplete); ble.gap().setTxPower(txPower); GapAdvertisingData postavke = GapAdvertisingData(); @@ -489,39 +472,37 @@ wait(1); #endif - __enable_irq(); - /* SpinWait for initialization to complete. This is necessary because the BLE object is used in the main loop below. */ while (ble.hasInitialized() == false){ - /* spin loop */ + // spin loop } - + + __enable_irq(); + buffer_s = 0x0C; + serial.send(&buffer_s, sizeof(buffer_s)); + + printBufferLen = sprintf(buffer, "Going to sleep first time...\r\n"); + serial.send(buffer, printBufferLen); + goToSleep(); + + //buzzer.period(0.0F); + //buzzer.write(0.0F); + while(true){ - if(sleepFlag){ - NRF_GPIO->PIN_CNF[31] = 0x00000003; - NRF_PWM0->TASKS_STOP = 1; - NRF_PWM1->TASKS_STOP = 1; - NRF_PWM2->TASKS_STOP = 1; - NRF_PPI->TASKS_CHG[0].DIS = 1; - NRF_PPI->TASKS_CHG[1].DIS = 1; - NRF_PPI->TASKS_CHG[2].DIS = 1; - NRF_PPI->TASKS_CHG[3].DIS = 1; - NRF_PPI->TASKS_CHG[4].DIS = 1; - NRF_GPIOTE->TASKS_CLR[0] = 1; - NRF_GPIOTE->TASKS_CLR[1] = 1; - NRF_GPIOTE->TASKS_CLR[2] = 1; - NRF_GPIOTE->TASKS_CLR[3] = 1; - NRF_GPIOTE->TASKS_CLR[4] = 1; - NRF_GPIOTE->TASKS_CLR[5] = 1; - NRF_GPIOTE->TASKS_CLR[6] = 1; - NRF_GPIOTE->TASKS_CLR[7] = 1; + if(0){ + //buzzer.period(0.0F); + //buzzer.write(0.0F); #if USE_ACC i2cPower = 0; #endif + ble.waitForEvent(); __WFI(); } else{ + printBufferLen = sprintf(buffer, "Second else...\r\n"); + serial.send(buffer, printBufferLen); ble.waitForEvent(); + __WFI(); } } }