EEP fORK

Dependencies:   BLE_API mbed nRF51822

Fork of MCS_LRF by Farshad N

Revision:
15:bc4f8c597c26
Parent:
13:a051da83a849
Child:
16:dc9956bac1a3
Child:
17:229d78f063fb
--- a/main.cpp	Thu Oct 20 04:01:29 2016 +0000
+++ b/main.cpp	Mon Feb 27 01:35:10 2017 +0000
@@ -84,21 +84,22 @@
 Timer timer;
 Ticker batteryChecker;
 Ticker activityChecker;
-bool powerOffState = true;
+
 
 const static char     DEVICE_NAME[]    = "MCS_LRF";
 const static char     MANUFACTURER[]   = "MCS";
 const static char     MODEL[]          = "Model 2";
 const static char     SERIAL_NO[]      = "SN 1234";
 const static char     HARDWARE_REV[]   = "hw-rev 1.1";
-const static char     FIRMWARE_REV[]   = "fw-rev 1.1";
-const static char     SOFTWARE_REV[]   = "soft-rev 1";
+const static char     FIRMWARE_REV[]   = "fw-rev 1.3";
+const static char     SOFTWARE_REV[]   = "soft-rev 1.3";
 
 // these values must macth definitions in the XML file accompanying this device
 const static uint16_t distanceCmd   = 0x0001;
 const static uint16_t triggerCmd    = 0x0002;
 const static uint16_t redDotCmd     = 0x0003;
 const static uint16_t resetCmd      = 0x0004;
+const static uint16_t nSamplesCmd   = 0x0005;
 
 
 void activityCheckerTask();
@@ -152,7 +153,7 @@
                     laserPtr->setRedDot(params->data[2]);
                 }
                 break;
-                
+
             case resetCmd:
                 if(isSetCmd && params->len == 3) {
                     DEBUG("CMD is reset\n\r");
@@ -163,6 +164,14 @@
                     laserPtr->enableMeasurement(true);
                 }
                 break;
+                
+            case nSamplesCmd:
+                if(isSetCmd && params->len == 4) {
+                    DEBUG("CMD is nSample\n\r");
+                     int16_t nSamples = params->data[2] + (params->data[3] << 8);
+                    laserPtr->setNumberOfSamples(nSamples);
+                }
+                break;
 
             default:
                 break;
@@ -192,83 +201,6 @@
     *prts = 0xffffffff;
 }
 
-
-    uint32_t base = 0x40002000;
-    uint32_t rxOffset = 0x514;
-    uint32_t txOffset = 0x50c;
-
-    uint32_t rx = base + rxOffset;
-    uint32_t tx = base + txOffset;
-
-    uint32_t* prx = (uint32_t*)rx;
-    uint32_t* ptx = (uint32_t*)tx;
-
-// when connceting power to the laser module ensure that tx and rx pins are 
-// reassigned to the serial port   
-void connectPower()
-{
-    disableLRF = 0;
-    nReset = 1;
-    *ptx = 27;  // p27 for tx
-    *prx = 26;  // p26 for rx
-    wait_ms(1000);
-}
-
-// when removing power from the laser module ensure that rx and tx pins are not
-// driving voltage into the laser module to avoid hardware damange
-void removePower(){
-    *ptx = 0xffffffff;      // no pin for tx
-    *prx = 0xffffffff;      // no pin for rx
-    DigitalOut rx(p26);
-    DigitalOut tx(p27);
-    rx = 0;
-    tx = 0;
-    nReset = 0;
-    disableLRF = 1;
-}
-
-void turnLaserPowerOn()
-{
-    if(powerOffState == true) {
-        powerOffState = false;
-        
-        connectPower();
-             
-        // trun power back on and reinstate serial and laser
-        //DigitalIn rx(p26, PullUp);
-//        serialPtr = new Serial(p27, p26);
-//        serialPtr->baud(READER_BAUD_RATE);
-//        disableFlowControl();
-//        laserPtr = new Laser(*serialPtr);
-        
-        laserPtr->enableMeasurement(true);
-        laserPtr->setRedDot(1);
-    }
-}
-
-void turnLaserPowerOff()
-{
-    if(powerOffState == false) {
-        powerOffState = true;
-        laserPtr->setRedDot(0);   // this disables measurements
-        
-        removePower();
-        
-        // also take power off the Laser, but first ensure io pins are not powered
-       // if(serialPtr != NULL) delete serialPtr;
-//        serialPtr = new Serial(NC, p26);
-//        DigitalOut rx(p26);
-//        DigitalOut tx(p27);
-//        rx = 0;
-//        tx = 0;
-       // if(laserPtr != NULL) delete laserPtr;
-      //  laserPtr = new Laser(*serialPtr);
-        
-     //   nReset = 0;
-     //   disableLRF = 1;
-    }
-}
-
 void resetActivityCheckerTask()
 {
     activityChecker.detach();
@@ -290,8 +222,8 @@
 
         // make sure the laser is not powered off due to inactivity
         resetActivityCheckerTask();
-        turnLaserPowerOn();
-        
+        laserPtr->turnLaserPowerOn();
+
         processData(params);
     }
 }
@@ -323,8 +255,7 @@
     float batt = battVoltage.read();
     enableBattVoltSense = 0;
 
-    if(redLed == 0 && batt < BATT_VALUE_THRESHOLD)
-    {
+    if(redLed == 0 && batt < BATT_VALUE_THRESHOLD) {
         redLed = 1;
     }
 }
@@ -335,8 +266,8 @@
 void triggerFall()
 {
     resetActivityCheckerTask();
-    turnLaserPowerOn();
-    
+    laserPtr->turnLaserPowerOn();
+
     laserPtr->triggerDistanceMeasurement();
 
     timer.reset();
@@ -350,8 +281,8 @@
     int elapsed = timer.read_ms();
     timer.stop();
     if(elapsed > PB_HOLD_TIME) {
-        turnLaserPowerOff();
-    } 
+        laserPtr->turnLaserPowerOff();
+    }
     //else if(elapsed > PB_DEBUNCE_TIME) {
 //        laserPtr->triggerDistanceMeasurement();
 //    }
@@ -360,14 +291,14 @@
 void activityCheckerTask()
 {
     // too long with no activity- turn pwer off from laser to preserve power
-    turnLaserPowerOff();
+    laserPtr->turnLaserPowerOff();
 }
 
 int main(void)
 {
     connectionLed = 0;
-    
-    // turn laser on and reset and wait for it to settle 
+
+    // turn laser on and reset and wait for it to settle
     disableLRF = 0;
     nReset = 1;
     wait_ms(1000);
@@ -388,11 +319,11 @@
                                      (uint8_t *)GattService::UUID_DEVICE_INFORMATION_SERVICE, sizeof(GattService::UUID_DEVICE_INFORMATION_SERVICE));
     ble.setAdvertisingInterval(GapAdvertisingParams::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000));
     ble.startAdvertising();
-    
+
     // check battery level now and every minute afterwards
     batteryCheckerTask();
-    batteryChecker.attach(batteryCheckerTask, 1);
-    
+    batteryChecker.attach(batteryCheckerTask, 60);
+
     // check acticity once every 3 minutes
     activityChecker.attach(activityCheckerTask, ACTIVITY_TIMEOUT_SEC);
 
@@ -421,7 +352,7 @@
     laserPtr = new Laser(*serialPtr);
     laserPtr->enableMeasurement(true);
     laserPtr->setDistaceCallback(&distanceCallcack);
-    turnLaserPowerOn();
+    laserPtr->turnLaserPowerOn();
 
     while (true) {
         ble.waitForEvent();