Geo beacon for VF.
Dependencies: MMA8452 aconno_bsp adc52832_common
Revision 14:d506c0679c0b, committed 2017-07-27
- Comitter:
- jurica238814
- Date:
- Thu Jul 27 15:04:50 2017 +0000
- Parent:
- 13:d51127eed926
- Child:
- 15:934a04c958f5
- Commit message:
- Debug version. Beacons ping each other (the send and scan for the same msg).
Changed in this revision
| main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/main.cpp Wed Jul 26 20:11:45 2017 +0000
+++ b/main.cpp Thu Jul 27 15:04:50 2017 +0000
@@ -15,13 +15,13 @@
#define DEBUG (1)
#define DEBUG_ACC (0)
-#define SLEEP_TIME (2.0) /* Sleep time in seconds WAS 0.85 */
-#define ADV_TIMER_TIME (1.1) /* Advertising time (in s) */
-#define SCAN_TIMER_TIME (1.5) /* Scanning time (in s) */
-#define FREE_TIME (1.01) /* Time between end of a scanning and sleep mode */
-#define AWAKE_TIME (ADV_TIMER_TIME+SCAN_TIMER_TIME+FREE_TIME) /* Was 0.15 */
-#define SHORT_SLEEP_TIME (2.5) /* Shorter sleep time (s) */
-#define SHORT_SLEEP_TIME_PERIOD (60) /* Time after a last scanned advertisment. In the period, sleep time is SHORT_SLEEP_TIME */
+#define SLEEP_TIME_S (2.0) /* Sleep time in seconds WAS 0.85 */
+#define ADV_TIMER_TIME_S (1.0) /* Advertising time (in s) */
+#define SCAN_TIMER_TIME_S (2.0) /* 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) */
+#define SHORT_SLEEP_TIME_PERIOD_S (5) /* Time after a last scanned advertisment. In the period, sleep time is SHORT_SLEEP_TIME */
/* Static constants for the BLE example */
@@ -29,10 +29,10 @@
#define MSD_SIZE (18)
#define MSD_ID (0xFF)
-#define BUZZ_TIME (2.0) /* Buzz time in s */
+#define BUZZ_TIME_S (0.25) /* Buzz time in s */
#define ADV_INTERVAL (100) /* Advertising interval (in ms) */
-#define SCAN_INTERVAL (SCAN_TIMER_TIME) /* Scan interval (in ms) */
-#define SCAN_WINDOW (SCAN_TIMER_TIME)
+#define SCAN_INTERVAL (SCAN_TIMER_TIME_S) /* Scan interval (in ms) */
+#define SCAN_WINDOW (SCAN_TIMER_TIME_S)
/* Static constants for the accelerometer */
@@ -44,22 +44,22 @@
#define BUZZER (p31)
uint8_t sleepFlag = 0;
-uint8_t tempSleepTime = SLEEP_TIME;
+uint8_t tempSleepTime = SLEEP_TIME_S;
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 msd[MSD_SIZE] = {0x59, 0x00, 0xE1, 0x61, 0x35, 0xBA, 0xC0, 0xEC, 0x47, 0x2A, 0x98, 0x00, 0xAF, 0x18, 0x43, 0xFF, 0x05, 0x00};
+uint8_t myMacAddress[6] = {};
uint8_t buzzer_flag = 0;
-enum _radioState{
+enum RadioState{
OFF,
ADVERTISING,
SCANNING
};
-enum _radioState radioState = OFF;
+enum RadioState radioState = OFF;
-void turnBuzzOff(void);
-void goToSleep();
-void startAdvertising();
+void TurnBuzzOff(void);
+void GoToSleep();
+void StartAdvertising();
void startScanning();
void WakeMeUp();
@@ -68,7 +68,7 @@
Ticker sleepChanger;
PwmOut buzzer(BUZZER);
PwmOut gyro_power(p7);
-PwmOut i2c_power(p5); // I2C Pull-ups power pin
+PwmOut i2c_power(p5); /* I2C Pull-ups power pin */
InterruptIn gyro_pulse(INT2_PIN);
Acc_MMA8452 acc(I2C_DATA, I2C_CLK, MMA8452_ADDRESS);
BLE &ble = BLE::Instance();
@@ -121,14 +121,14 @@
/* Get my MAC address */
BLEProtocol::AddressType_t temp_address_type;
- ble.gap().getAddress(&temp_address_type, my_mac_address);
+ ble.gap().getAddress(&temp_address_type, myMacAddress);
/* 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().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
+ //ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_NON_CONNECTABLE_UNDIRECTED);
+ 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();
}
@@ -148,43 +148,41 @@
return 0;
}
+uint8_t CheckMac(const Gap::AdvertisementCallbackParams_t *params, uint8_t *myMacAddress, uint8_t msdOffset){
+ int i=0;
+
+ if(msdOffset == 0){
+ return 0; // There's no MSD in BLE advertisement data
+ }
+ for(i=0; i<6; i++){
+ if(!(params->advertisingData[msdOffset+i+3]) == *(myMacAddress+5-i)){
+ return 0;
+ }
+ }
+ return 1;
+}
+
/**
* Function is called when BLE radio discovers any kind of advertisment
*/
void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params){
- uint8_t i=0;
uint8_t msdOffset;
msdOffset = findMSDIndex(params);
if(msdOffset == 0){
- // There's no MSD in BLE advertisement data
- return;
+ return; // There's no MSD in BLE advertisement data
}
-
- if ((params->advertisingData[msdOffset]) == MSD_ID){
+ if ((params->advertisingData[msdOffset]) == MSD_ID){
// Follows Manufacturer Specific Data
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]){
- continue;
- }
- else{
- return;
- }
+ if(CheckMac(params, myMacAddress, msdOffset)){
+ ble.gap().stopScan();
+ buzzer.write(0.5F);
+ WakeSleepT.detach();
+ turnBuzzOffT.detach();
+ turnBuzzOffT.attach(TurnBuzzOff, BUZZ_TIME_S);
}
- /*
- ble.gap().stopScan();
- turnBuzzOffT.detach();
- WakeSleepT.detach();
- buzzer.write(0.5F);
- turnBuzzOffT.attach(turnBuzzOff, BUZZ_TIME);
- */
- buzzer.write(0.5F);
- WakeSleepT.detach();
- turnBuzzOffT.attach(turnBuzzOff, BUZZ_TIME);
- //wait_ms(100);
- //buzzer.write(0.0F);
}
}
}
@@ -193,7 +191,7 @@
/* Call this function few minutes (TBD) after a last scanned advertisment */
void changeSleepTime(){
- tempSleepTime = SLEEP_TIME;
+ tempSleepTime = SLEEP_TIME_S;
sleepChanger.detach();
}
@@ -201,29 +199,13 @@
/**
* The function is called when ticker generates interrupt
*/
-void turnBuzzOff(void){
+void TurnBuzzOff(void){
buzzer.write(0.0F);
- tempSleepTime = SHORT_SLEEP_TIME;
+ tempSleepTime = SHORT_SLEEP_TIME_S;
turnBuzzOffT.detach();
- //ble.gap().startScan(advertisementCallback);
- //WakeSleepT.attach(WakeMeUp, AWAKE_TIME);
WakeSleepT.detach();
- radioState = SCANNING;
- //WakeMeUp();
-
- sleepChanger.attach(changeSleepTime, SHORT_SLEEP_TIME_PERIOD);
-
- radioState = OFF;
- sleepFlag = 1;
- ble.gap().stopAdvertising(); // Just in case
- ble.gap().stopScan();
- WakeSleepT.detach();
- //WakeSleepT.attach(goToSleep, FREE_TIME);
- WakeSleepT.attach(WakeMeUp, tempSleepTime);
- #if DEBUG
- advLED = 1;
- scanLED = 1;
- #endif
+ sleepChanger.attach(changeSleepTime, SHORT_SLEEP_TIME_PERIOD_S);
+ WakeSleepT.attach(WakeMeUp, FREE_TIME_S);
}
void startAdvertising(){
@@ -233,42 +215,39 @@
scanLED = 1;
#endif
WakeSleepT.detach();
- WakeSleepT.attach(WakeMeUp, ADV_TIMER_TIME); // Call the wakeMeUp function
+ WakeSleepT.attach(WakeMeUp, ADV_TIMER_TIME_S); // Call the wakeMeUp function
}
void startScanning(){
ble.gap().stopAdvertising();
ble.gap().setScanParams(SCAN_INTERVAL, SCAN_WINDOW);
- ble.gap().setScanTimeout(SCAN_TIMER_TIME);
+ ble.gap().setScanTimeout(SCAN_TIMER_TIME_S);
ble.gap().startScan(advertisementCallback);
#if DEBUG
advLED = 1;
scanLED = 0;
#endif
WakeSleepT.detach();
- WakeSleepT.attach(WakeMeUp, SCAN_TIMER_TIME);
+ WakeSleepT.attach(WakeMeUp, SCAN_TIMER_TIME_S);
}
void WakeMeUp(){
sleepFlag = 0;
switch(radioState){
case OFF:{
+ radioState = ADVERTISING;
startAdvertising();
- radioState = ADVERTISING;
break;
}
case ADVERTISING:{
+ radioState = SCANNING;
startScanning();
- radioState = SCANNING;
break;
}
case SCANNING:{
radioState = OFF;
- sleepFlag = 1;
- ble.gap().stopAdvertising(); // Just in case
- ble.gap().stopScan();
WakeSleepT.detach();
- WakeSleepT.attach(goToSleep, FREE_TIME);
+ WakeSleepT.attach(GoToSleep, FREE_TIME_S);
#if DEBUG
advLED = 1;
scanLED = 1;
@@ -279,7 +258,7 @@
}
}
-void goToSleep(){
+void GoToSleep(){
WakeSleepT.detach();
WakeSleepT.attach(WakeMeUp, tempSleepTime);
ble.gap().stopAdvertising();
@@ -311,7 +290,8 @@
advLED = 1;
scanLED = 1;
#endif
- WakeSleepT.attach(goToSleep, AWAKE_TIME);
+
+ WakeSleepT.attach(GoToSleep, AWAKE_TIME_S);
ble.init(bleInitComplete);
ble.gap().setTxPower(txPower);
GapAdvertisingData postavke = GapAdvertisingData();

