High level Bluetooth Low Energy API and radio abstraction layer

Fork of BLE_API by Bluetooth Low Energy

Revision:
906:8ddab3271c2f
Parent:
890:f3144091ae19
Child:
907:f9a79127973a
--- a/ble/services/EddystoneService.h	Thu Nov 26 12:52:02 2015 +0000
+++ b/ble/services/EddystoneService.h	Thu Nov 26 12:52:02 2015 +0000
@@ -101,9 +101,9 @@
     void setUIDFrameData(int8_t           power,
                          UIDNamespaceID_t namespaceID,
                          UIDInstanceID_t  instanceID,
-                         uint32_t         uidAdvPeriodIn,
+                         float            uidAdvPeriodIn,
                          uint16_t         RFU = 0x0000) {
-        if (0 == uidAdvPeriodIn) {
+        if (0.0f == uidAdvPeriodIn) {
             uidIsSet = false;
             return;
         }
@@ -170,21 +170,45 @@
      *  @param[in] urlAdvPeriodIn How long to advertise the URL frame (measured in # of adv periods)
      *  @return false on success, true on failure.
      */
-    bool setURLFrameData(int8_t power, const char *urlIn, uint32_t urlAdvPeriodIn) {
-        if (0 == urlAdvPeriodIn) {
+    bool setURLFrameData(int8_t power, const char *urlIn, float urlAdvPeriodIn) {
+        if (0.0f == urlAdvPeriodIn) {
             urlIsSet = false;
             return false;
         }
-        defaultUrlPower = power;
         encodeURL(urlIn, defaultUriData, defaultUriDataLength); // encode URL to URL Formatting
         if (defaultUriDataLength > URI_DATA_MAX) {
             return true;                                        // error, URL is too big
         }
+        defaultUrlPower = power;
         urlAdvPeriod = urlAdvPeriodIn;
         urlIsSet     = true;
         return false;
     }
 
+    /**
+     *  Set Eddystone URL Frame information.
+     *  @param[in] power              TX Power in dB measured at 0 meters from the device.
+     *  @param[in] encodedUrlIn       Encoded URL
+     *  @param[in] encodedUrlInLength Length of the encoded URL
+     *  @param[in] urlAdvPeriodIn     How long to advertise the URL frame (measured in # of adv periods)
+     *  @return false on success, true on failure.
+     */
+    bool setURLFrameEncodedData(int8_t power, const char *encodedUrlIn, uint8_t encodedUrlInLength, float urlAdvPeriodIn) {
+        if (0.0f == urlAdvPeriodIn) {
+            urlIsSet = false;
+            return false;
+        }
+        memcpy(defaultUriData, encodedUrlIn, encodedUrlInLength);
+        if (defaultUriDataLength > URI_DATA_MAX) {
+            return true;                                        // error, URL is too big
+        }
+        defaultUrlPower      = power;
+        defaultUriDataLength = encodedUrlInLength;
+        urlAdvPeriod         = urlAdvPeriodIn;
+        urlIsSet             = true;
+        return false;
+    }
+
     /*
     *  Construct URL frame from private variables
     *  @param[in/out] Data pointer to array to store constructed frame in
@@ -211,12 +235,12 @@
     *
     */
     void setTLMFrameData(uint8_t  version        = 0,
-                         uint32_t advPeriod      = 60,
+                         float    advPeriod      = 60.0f,
                          uint16_t batteryVoltage = 0,
-                         uint16_t beaconTemp     = 0,
+                         uint16_t beaconTemp     = 0x8000,
                          uint32_t pduCount       = 0,
                          uint32_t timeSinceBoot  = 0) {
-        if (0 == advPeriod) {
+        if (0.0f == advPeriod) {
             tlmIsSet = false;
             return;
         }
@@ -236,6 +260,10 @@
     *  @return number of bytes used. negative number indicates error message.
     */
     int constructTLMFrame(uint8_t *Data, uint8_t maxSize) {
+        uint32_t now = timeSinceBootTimer.read_ms();
+        TlmTimeSinceBoot += (now - lastBootTimerRead) / 100;
+        lastBootTimerRead = now;
+
         int index = 0;
         Data[index++] = FRAME_TYPE_TLM;                    // Eddystone frame type = Telemetry
         Data[index++] = TlmVersion;                        // TLM Version Number
@@ -292,14 +320,6 @@
     }
 
     /*
-    *  callback function, called every 0.1s, incriments the TimeSinceBoot field in the TLM frame
-    *  @return nothing
-    */
-    void tsbCallback(void) {
-        TlmTimeSinceBoot++;
-    }
-
-    /*
     * Update advertising data
     * @return true on success, false on failure
     */
@@ -487,7 +507,7 @@
         // Initialize Frame transition, start with URL to pass eddystone validator app on first try
         if (urlIsSet) {
             frameIndex = url;
-            urlTicker.attach(this, &EddystoneService::urlCallback, urlAdvPeriod);
+            urlTicker.attach(this, &EddystoneService::urlCallback, (float) advPeriodus / 1000.0f);
             DBG("attached urlCallback every %d seconds", urlAdvPeriod);
         }
         if (uidIsSet) {
@@ -500,7 +520,8 @@
             // Make double sure the PDUCount and TimeSinceBoot fields are set to zero at reset
             updateTlmPduCount(0);
             updateTlmTimeSinceBoot(0);
-            timeSinceBootTick.attach(this, &EddystoneService::tsbCallback, 0.1); // incriment the TimeSinceBoot ticker every 0.1s
+            lastBootTimerRead = 0;
+            timeSinceBootTimer.start();
             tlmTicker.attach(this, &EddystoneService::tlmCallback, TlmAdvPeriod);
             DBG("attached tlmCallback every %d seconds", TlmAdvPeriod);
         }
@@ -519,7 +540,8 @@
     BLEDevice           &ble;
     uint16_t            advPeriodus;
     uint8_t             txPower;
-    Ticker              timeSinceBootTick;  // counter that counts time since boot
+    Timer               timeSinceBootTimer;
+    volatile uint32_t   lastBootTimerRead;
     volatile bool       advLock;
     volatile FrameTypes frameIndex;
     Timeout             stopAdv;
@@ -530,7 +552,7 @@
     UriData_t           defaultUriData;
     int8_t              defaultUrlPower;
     bool                urlIsSet;       // flag that enables / disable URI Frames
-    uint32_t            urlAdvPeriod;   // how long the url frame will be advertised for
+    float               urlAdvPeriod;   // how long the url frame will be advertised for
     Ticker              urlTicker;
 
     // UID Frame Variables
@@ -539,7 +561,7 @@
     int8_t              defaultUidPower;
     uint16_t            uidRFU;
     bool                uidIsSet;       // flag that enables / disable UID Frames
-    uint32_t            uidAdvPeriod;   // how long the uid frame will be advertised for
+    float               uidAdvPeriod;   // how long the uid frame will be advertised for
     Ticker              uidTicker;
 
     // TLM Frame Variables
@@ -549,7 +571,7 @@
     volatile uint32_t   TlmPduCount;
     volatile uint32_t   TlmTimeSinceBoot;
     bool                tlmIsSet;          // flag that enables / disables TLM frames
-    uint32_t            TlmAdvPeriod;      // number of minutes between adv frames
+    float               TlmAdvPeriod;      // number of minutes between adv frames
     Ticker              tlmTicker;
 
 public: