Geo beacon for VF.
Dependencies: MMA8452 aconno_bsp adc52832_common
Revision 10:fd91664032d8, committed 2017-07-25
- Comitter:
- jurica238814
- Date:
- Tue Jul 25 09:22:32 2017 +0000
- Parent:
- 9:2ab2be19add9
- Child:
- 11:92a9fffd5015
- Commit message:
- Scanner works exclusively with advertiser. ; Timing is bad (long periods) but seems to work stable with the app.
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Thu Jul 20 13:44:49 2017 +0000
+++ b/main.cpp Tue Jul 25 09:22:32 2017 +0000
@@ -12,17 +12,23 @@
#include "acd52832_bsp.h"
#include "mma8452.h"
-#define DEBUG 1
+#define DEBUG (1)
+#define DEBUG_ACC (0)
-#define SLEEP_TIME (2.0) // Sleep time in seconds WAS 0.85
-#define AWAKE_TIME (2.0) // Was 0.15
-#define BUZZER (p31)
+#define SLEEP_TIME (2.0) // Sleep time in seconds WAS 0.85
+#define AWAKE_TIME (3.0) // Was 0.15
+#define ADV_TIMER_TIME (1.0) // Advertising time (in s)
+#define SCAN_TIMER_TIME (2.0) // Scanning time (in s)
+#define FREE_TIME (0.01) // Time between end of a scanning and sleep mode
/* Static constants for the BLE example */
#define MAX_BLE_PACKET_SIZE (31)
#define MSD_SIZE (18)
#define MSD_ID (0xFF)
#define BUZZ_TIME (1.0) // Buzz time in s
+#define ADV_INTERVAL (100) // Advertising interval (in ms)
+#define SCAN_INTERVAL (100) // Scan interval (in ms)
+#define SCAN_WINDOW (50)
/* Static constants for the accelerometer */
#define WHO_AM_I 0x0D // Type 'read' : This should return the device id of 0x2A
@@ -30,15 +36,26 @@
#define I2C_DATA (p29)
#define I2C_CLK (p2)
#define INT2_PIN (p4)
+#define BUZZER (p31)
-uint8_t sleepFlag = 1;
+uint8_t sleepFlag = 0;
int8_t txPower = 4;
uint8_t MSD[MSD_SIZE] = {0x59, 0x00, 0xE1, 0x61, 0x35, 0xBA, 0xC0, 0xEC, 0x47, 0x2A, 0x98, 0x00, 0xAF, 0x18, 0x43, 0xFF, 0x05, 0x00};
uint8_t my_mac_address[6] = {};
uint8_t buzzer_flag = 0;
+enum _radioState{
+ OFF,
+ ADVERTISING,
+ SCANNING
+ };
+enum _radioState radioState = OFF;
+
void turnBuzzOff(void);
void goToSleep();
+void startAdvertising();
+void startScanning();
+void WakeMeUp();
Ticker WakeSleepT;
Ticker turnBuzzOffT;
@@ -49,23 +66,19 @@
Acc_MMA8452 acc(I2C_DATA, I2C_CLK, MMA8452_ADDRESS);
BLE &ble = BLE::Instance();
+
#if DEBUG
+ DigitalOut advLED(p22);
+ DigitalOut scanLED(p23);
+ DigitalOut awake(p24);
+#endif
+#if DEBUG_ACC
DigitalOut int_led(p22);
- DigitalOut awake(p24);
#endif
/* Restart Advertising on disconnection*/
void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
- BLE::Instance().gap().startAdvertising();
-}
-
-/**
- * The function is called when ticker generates interrupt
- */
-void turnBuzzOff(void){
- buzzer.write(0.0F);
- turnBuzzOffT.detach();
- WakeSleepT.attach(goToSleep, AWAKE_TIME);
+ //BLE::Instance().gap().startAdvertising();
}
/**
@@ -104,11 +117,12 @@
/* setup advertising */
+
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::MANUFACTURER_SPECIFIC_DATA, (uint8_t *)MSD, MSD_SIZE);
ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
- ble.gap().setAdvertisingInterval(100); // --> Has to be at least 100ms!
- ble.gap().startAdvertising();
+ ble.gap().setAdvertisingInterval(ADV_INTERVAL); // --> Has to be at least 100ms!
+ //ble.gap().startAdvertising();
}
@@ -133,6 +147,7 @@
uint8_t i=0;
uint8_t msdOffset;
+ ble.gap().stopScan();
msdOffset = findMSDIndex(params);
if(msdOffset == 0){
// There's no MSD in BLE advertisement data
@@ -144,35 +159,89 @@
if ((params->advertisingData[msdOffset+1]) == 0x59){
if ((params->advertisingData[msdOffset+2]) == 0x00){
for(i=0; i<6; i++){
- if((params->advertisingData[msdOffset+i+3]) == my_mac_address[5-i]){
+ if((params->advertisingData[msdOffset+i+3]) == my_mac_address[5-i] || 1){
continue;
}
else{
- //return;
+ return;
}
}
turnBuzzOffT.detach();
WakeSleepT.detach();
buzzer.write(0.5F);
turnBuzzOffT.attach(turnBuzzOff, BUZZ_TIME);
+ //wait_ms(40);
+ //buzzer.write(0.0F);
}
}
}
}
-void WakeMeUp(){
- WakeSleepT.detach();
+/**
+ * The function is called when ticker generates interrupt
+ */
+void turnBuzzOff(void){
+ buzzer.write(0.0F);
+ turnBuzzOffT.detach();
+ ble.gap().startScan(advertisementCallback);
WakeSleepT.attach(goToSleep, AWAKE_TIME);
-
+}
+
+void startAdvertising(){
+ ble.gap().startAdvertising();
+ radioState = ADVERTISING;
+ #if DEBUG
+ advLED = 0;
+ scanLED = 1;
+ #endif
+ WakeSleepT.detach();
+ WakeSleepT.attach(WakeMeUp, ADV_TIMER_TIME); // Call the wakeMeUp function
+}
+
+void startScanning(){
+ ble.gap().stopAdvertising();
+ ble.gap().setScanParams(SCAN_INTERVAL, SCAN_WINDOW);
+ ble.gap().setScanTimeout(SCAN_TIMER_TIME);
ble.gap().startScan(advertisementCallback);
- ble.gap().startAdvertising();
+ radioState = SCANNING;
+ #if DEBUG
+ advLED = 1;
+ scanLED = 0;
+ #endif
+ WakeSleepT.detach();
+ WakeSleepT.attach(WakeMeUp, SCAN_TIMER_TIME);
+}
+
+void WakeMeUp(){
sleepFlag = 0;
+ switch(radioState){
+ case OFF:{
+ startAdvertising();
+ break;
+ }
+ case ADVERTISING:{
+ startScanning();
+ break;
+ }
+ case SCANNING:{
+ radioState = OFF;
+ ble.gap().stopAdvertising(); // Just in case
+ ble.gap().stopScan();
+ WakeSleepT.detach();
+ WakeSleepT.attach(goToSleep, FREE_TIME);
+ #if DEBUG
+ advLED = 1;
+ scanLED = 1;
+ #endif
+ break;
+ }
+ default: return;
+ }
}
void goToSleep(){
WakeSleepT.detach();
WakeSleepT.attach(WakeMeUp, SLEEP_TIME);
-
ble.gap().stopAdvertising();
ble.gap().stopScan();
sleepFlag = 1;
@@ -186,7 +255,7 @@
}
void pulse_handler(void){
- #if DEBUG
+ #if DEBUG_ACC
int_led = !int_led;
#endif
i2c_power.write(1.0F);
@@ -196,14 +265,20 @@
//WakeSleepT.attach(goToSleep, AWAKE_TIME);
}
-int main(void){
+int main(void){
+ #if DEBUG
+ awake = 1;
+ advLED = 1;
+ scanLED = 1;
+ #endif
WakeSleepT.attach(goToSleep, AWAKE_TIME);
ble.init(bleInitComplete);
ble.gap().setTxPower(txPower);
GapAdvertisingData postavke = GapAdvertisingData();
- ble.gap().setScanParams(100, 100);
- ble.gap().startScan(advertisementCallback);
+ //ble.gap().setScanParams(SCAN_INTERVAL, SCAN_WINDOW);
+ //ble.gap().setScanTimeout(0.5);
+ //ble.gap().startScan(advertisementCallback);
buzzer.period(0.001F);
buzzer.write(0.0F);
@@ -237,12 +312,6 @@
while (ble.hasInitialized() == false){
/* spin loop */
}
-
- while(1){
- ble.waitForEvent();
- awake != awake;
- wait_ms(100);
- }
while(true){
if(sleepFlag){

