JLC test
Dependencies: PinDetect libmDot mbed-rtos mbed
main.cpp
- Committer:
- tmulrooney
- Date:
- 2016-01-30
- Revision:
- 2:376af6a70e8a
- Parent:
- 1:96c429800568
File content as of revision 2:376af6a70e8a:
/**********************************************************************************
* This program monitors the power on state, kill state and battery voltage on
* Woodstream mouse trap using the Multitech mDot and UDK2 development system.
* The power on state is monitored on the PA_4(UDK2 Pin D10)and the kill state is
* monitored on the PA_5 (UDK2 Pin D13) Digital Input Pins. The battery voltage
* is monitored on the PB_1 (UDK2 Pin A0) Analog Input. The status of these pins
* are transferred from the mDot LoRa to the Conduit LoRa gateway. The status is
* also shown on the USB Debug Terminal Window.
*********************************************************************************/
#include "mbed.h"
#include "mDot.h"
#include "MTSLog.h"
#include <string>
#include <vector>
#include <algorithm>
#include "PinDetect.h"
#include "common.h"
#define I2C_TIME 5
#define LED_TIME 1
#define BATTERY_TIME 2.0
#define KILL_STATUS_TIME 3.0
#define POWER_ON_TIME 4.0
//mDot* dot;
Ticker ledTimer;
Ticker batteryTimer;
Ticker killStatusTimer;
Ticker powerOnTimer;
AnalogIn batteryVoltage(PTB0);
DigitalIn powerOn(PTC1); /* SW2 */
DigitalIn killStatus(PTB17); /* SW3 */
DigitalOut led_red(PTA1);
DigitalOut led_green(PTA2);
//DigitalOut led_blue(PTD5);
DigitalOut spi_cs(PTD4);
//Serial pc(PTE0, PTE1);
Serial pc(PTD3, PTD2);
// Configuration variables
static std::string config_network_name = "LORA_NET";
static std::string config_network_pass = "BLUE_HEN1";
static uint8_t config_frequency_sub_band = 7;
//Global Variables
bool readyToSendI2C;
bool readyToSendBatteryVoltage;
bool readyToSendKillStatus;
bool readyToSendPowerOn;
float lastBatteryVoltage;
uint8_t lastKillStatus;
uint8_t lastPowerOn;
//Function prototypes
void timeOfDay();
void periodicSendTock();
void batteryRead();
void killStatusRead();
void powerOnRead();
void printError(mDot* dot, int32_t returnCode);
void printVersion();
bool setFrequencySubBand(uint8_t subBand);
bool setNetworkName(const std::string name);
bool setNetworkPassphrase(const std::string passphrase);
bool setTxDataRate(const int dataRate);
bool setPower(uint8_t power);
bool setAck(uint8_t retries);
bool joinNetwork();
bool send(const std::string text);
I2C i2c_mem(PTB3,PTB2);
//SPI spi_rf(PTD6, PTD7, PTD5, PTD4);
SPI spi_rf(PTD6, PTD7, PTD5);
int i2cAddr = 0xAA;
char data[0x10];
char data1[0x10];
int main()
{
bool configFail = false;
int ack;
readyToSendI2C = false;
readyToSendBatteryVoltage = false;
readyToSendKillStatus = false;
readyToSendPowerOn = false;
lastBatteryVoltage = 0.0;
lastKillStatus = killStatus;
lastPowerOn = powerOn;
i2c_mem.frequency(100000);
// Setup the spi for 8 bit data, high steady state clock,
// second edge capture, with a 1MHz clock rate
// spi_rf.format(16,3);
spi_rf.format(16,0);
spi_rf.frequency(1000000);
spi_cs = 1;
//Start LED startup sequence
ledTimer.attach(&timeOfDay, LED_TIME);
pc.baud(115200);
// pc.printf("\r\n\r\n");
// pc.printf("=====================================\r\n");
// pc.printf("JLC MT Demo \r\n");
// pc.printf("=====================================\r\n");
// get the mDot handle
// dot = mDot::getInstance();
/* dot->setLogLevel(mts::MTSLog::INFO_LEVEL);
//*******************************************
// configuration
//*******************************************
// reset to default config so we know what state we're in
dot->resetNetworkSession();
dot->resetConfig();
// set up the mDot with our network information: frequency sub band, network name, and network password
// these can all be saved in NVM so they don't need to be set every time - see mDot::saveConfig()
configFail = !setFrequencySubBand(config_frequency_sub_band);
configFail |= !setNetworkName(config_network_name);
configFail |= !setNetworkPassphrase(config_network_pass);
configFail |= !setTxDataRate(mDot::SF_8);
configFail |= !setPower(20); // Reduce latency for 868 units
configFail |= !setAck(0); // Disable ack for less latency
printf("Configration %s\r\n",configFail?"Failed":"Passed");
// save this configuration to the mDot's NVM
printf("saving config\r\n");
if (! dot->saveConfig())
{
logError("failed to save configuration");
}
//*******************************************
// end of configuration
//*******************************************
// keep trying to join the network
while (!joinNetwork())
{
wait(200);
dot->resetNetworkSession();
}
*/
// Stop LED startup sequence & configure them for operation
led_red = 1;
led_green = 1;
// led_blue = 1;
// start all paramter timers to sample analog and digital inputs
// batteryTimer.attach(batteryRead, BATTERY_TIME);
// killStatusTimer.attach(killStatusRead, KILL_STATUS_TIME);
// powerOnTimer.attach(powerOnRead, POWER_ON_TIME);
/* initialize time and date */
epoch =0;
/* Send message to verify UART is connected properly */
printVersion();
sprintf(TransmitBuffer,"%s cmd>",time_string);
pc.printf(TransmitBuffer);
while (1)
{
if (getLine() == 1) /* wait until command line complete */
{
executeCmd();
sprintf(TransmitBuffer,"%s cmd> ",time_string);
pc.printf("%s",TransmitBuffer);
}
#if 0
// is there anything to send
if(readyToSendI2C)
{
#if 0
data[0] = 0x12;
data[1] = 0x34;
data[2] = 0x56;
myI2CWrite(0,data,3);
myI2CRead(0,data1,3);
sprintf(latestData,"I2c %02X %02X %02X",data1[0], data1[1], data1[2]);
pc.printf("%s\r\n",latestData);
#endif
#if 1
// Send 0x8f, the command to read the WHOAMI register
data[0] = 0x12;
mySPIWrite(0x0A,data,1);
mySPIRead(0x0A,data1,1);
mySPIRead(0x42,data1,2);
// int spiData = spi_rf.write(0x0600 | 0x0000);
sprintf(latestData,"SPI %02X %02X",data1[0], data1[1]);
pc.printf("%s\r\n",latestData);
#endif
send(latestData);
readyToSendI2C = false;
}
if(readyToSendBatteryVoltage)
{
sprintf(latestData,"Voltage %2.2f",(double)lastBatteryVoltage);
pc.printf("%s\r\n",latestData);
send(latestData);
readyToSendBatteryVoltage = false;
}
if(readyToSendKillStatus)
{
sprintf(latestData,"KillStatus %d",lastKillStatus);
pc.printf("%s\r\n",latestData);
send(latestData);
readyToSendKillStatus = false;
}
if(readyToSendPowerOn)
{
sprintf(latestData,"PowerOn %d",lastPowerOn);
pc.printf("%s\r\n",latestData);
send(latestData);
readyToSendPowerOn = false;
}
#endif
}
}
void I2CWrite(uint16 addr, uint8 *data, int length)
{
int i;
char bytes[3];
for(i=0; i< length; i++,addr++)
{
bytes[0] = addr >> 8;
bytes[1] = addr & 0xFF;
bytes[2] = data[i];
i2c_mem.write(i2cAddr, bytes, 3); /* write address and one byte */
while(i2c_mem.write(i2cAddr, bytes, 0) != 0); /* wait till write complete */
}
return;
}
void I2CRead(uint16 addr, uint8 *data, int length)
{
char bytes[2];
bytes[0] = addr >> 8;
bytes[1] = addr & 0xFF;
// sprintf(TransmitBuffer,"read I2C %04X %02X %04X\r\n",regAddress, bytes[0], bytes[1]);
// pc.printf(TransmitBuffer);
i2c_mem.write(i2cAddr, bytes, 2,true); /* write address with repeated start */
i2c_mem.read(i2cAddr, (char *)data, length); /* read all bytes */
return;
}
void SPIWrite(uint16 addr, uint8 *data, int length)
{
int i;
for(i=0;i<length;i++,addr++)
{
spi_cs = 0;
data[i] = spi_rf.write( (addr << 8) | data[i] | 0x8000);
spi_cs = 1;
}
}
void SPIRead(uint16 addr, uint8 *data, int length)
{
int i;
for(i=0;i<length;i++,addr++)
{
spi_cs = 0;
data[i] = spi_rf.write( (addr << 8) | data[i] | 0x0000);
spi_cs = 1;
}
}
void timeOfDay()
{
epoch++; /* update time of day */
led_red = !led_red;
// led_green = !led_green;
// led_blue = !led_blue;
readyToSendI2C = true;
}
void batteryRead()
{
lastBatteryVoltage = batteryVoltage * (float)3.3;
readyToSendBatteryVoltage = true;
}
void killStatusRead()
{
lastKillStatus = killStatus;
readyToSendKillStatus = true;
}
void powerOnRead()
{
lastPowerOn = powerOn;
readyToSendPowerOn = true;
}
bool setFrequencySubBand(uint8_t subBand)
{
/* int32_t returnCode;
printf("Setting frequency sub band to '%d'...\r\n", subBand);
if ((returnCode = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) {
printError(dot, returnCode);
return false;
}
return true;
*/
}
bool setNetworkName(const std::string name)
{
/* int32_t returnCode;
printf("Setting network name to '%s'...\r\n", name.c_str());
if ((returnCode = dot->setNetworkName(name)) != mDot::MDOT_OK)
{
printError(dot, returnCode);
return false;
}
return true;
*/}
bool setNetworkPassphrase(const std::string passphrase)
{
/* int32_t returnCode;
printf("Setting passphrase to '%s'...\r\n", passphrase.c_str());
if ((returnCode = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK)
{
printError(dot, returnCode);
return false;
}
return true;
*/}
bool setTxDataRate(const int dataRate)
{
/* int32_t returnCode;
printf("Setting TX Spreading factor to %d...\r\n",dataRate);
if ((returnCode = dot->setTxDataRate(dataRate)) != mDot::MDOT_OK)
{
logError("Failed To Set Tx Datarate %d:%s", returnCode, mDot::getReturnCodeString(returnCode).c_str());
printError(dot, returnCode);
return false;
}
return true;
*/}
bool setPower(uint8_t power)
{
/* int32_t returnCode;
printf("Setting tx power to '%d'...\r\n", power);
if ((returnCode = dot->setTxPower(power)) != mDot::MDOT_OK)
{
printError(dot, returnCode);
return false;
}
return true;
*/}
bool joinNetwork()
{
/* int32_t returnCode;
printf("\r\nJoining network...\r\n");
if ((returnCode = dot->joinNetworkOnce()) != mDot::MDOT_OK)
{
printError(dot, returnCode);
return false;
}
printf("Network Joined!\r\n");
return true;
*/}
bool setAck(uint8_t retries)
{
/* int32_t returnCode;
printf("Setting ack to '%d'...\r\n", retries);
if ((returnCode = dot->setAck(retries)) != mDot::MDOT_OK)
{
printError(dot, returnCode);
return false;
}
return true;
*/}
bool send(const std::string text)
{
/* int32_t returnCode;
uint32_t timeTillSend = dot->getNextTxMs();
if (timeTillSend != 0) {
printf("waiting %lu ms to send\r\n", timeTillSend);
return false;
}
printf("Sending data... ");
std::vector<uint8_t> data(text.begin(), text.end());
if ((returnCode = dot->send(data, 1)) != mDot::MDOT_OK)
{
printError(dot, returnCode);
return false;
}
printf("Data sent!\r\n");
return true;
*/}
void printError(mDot* dot, int32_t returnCode)
{
// std::string error = mDot::getReturnCodeString(returnCode) + " - " + dot->getLastError();
// printf("%s\r\n", error.c_str());
}