EEP fORK
Dependencies: BLE_API mbed nRF51822
Fork of MCS_LRF by
Diff: main.cpp
- 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();