The program sends the current location over the cellular network.
Dependencies: aconno_I2C ublox-at-cellular-interface gnss ublox-cellular-base Lis2dh12 ublox-cellular-base-n2xx ublox-at-cellular-interface-n2xx low-power-sleep
Fork of example-gnss by
main.cpp
- Committer:
- jurica238814
- Date:
- 2018-11-30
- Revision:
- 8:2bf886335fd0
- Parent:
- 7:746ae478fdf7
- Child:
- 9:f943c09d9173
File content as of revision 8:2bf886335fd0:
/**
* SAP Project by aconno
* Made by Jurica @ aconno
* More info @ aconno.de
*
*/
#include "mbed.h"
#include "ATCmdParser.h"
#include "FileHandle.h"
#include "gnss.h"
#include "aconnoConfig.h"
#include "uBloxSara.h"
#include "aconnoHelpers.h"
#include "Lis2dh12.h"
#include "tasks/tasks.h"
#define RED_LED_PIN (PE_3)
#define GREEN_LED_PIN (PE_4)
#define BLUE_LED_PIN (PE_1)
MainStates state = STATE_IDLE;
/* File handler */
FileHandle *fh;
/* AT Command Parser handle */
ATCmdParser *at;
GnssSerial gnss; // Serial interface (not I2C)
char locationGlobal[UDP_MSG_SIZE_B];
bool gotGnssFlag = false;
DigitalIn userButton(USER_BUTTON);
DigitalOut gnssPower(PE_0, 1);
DigitalOut redLed(RED_LED_PIN);
DigitalOut blueLed(BLUE_LED_PIN);
DigitalOut greenLed(GREEN_LED_PIN);
DigitalOut alarm(PE_14);
InterruptIn buttonInt(USER_BUTTON);
static bool wasAccInt = false;
static bool wasButtPressed = false;
static bool longPress = false;
Timer buttonTimer;
Thread timerThread;
Thread idleState;
Thread alarmState;
Thread alarmOffState;
Thread movementState;
Thread ledState;
Thread gnssLocation;
void my_bsp_init()
{
redLed = 1;
greenLed = 1;
blueLed = 1;
alarm = 0;
}
void buttonRiseHandler(void)
{
buttonTimer.reset();
buttonTimer.start();
timerThread.signal_set(BUTTON_PRESSED_SIGNAL);
}
void timerCallback(void)
{
float secondsPassed;
while(true)
{
bool nextState = false;
secondsPassed = 0;
Thread::signal_wait(BUTTON_PRESSED_SIGNAL);
Thread::signal_clr(BUTTON_PRESSED_SIGNAL);
while(!nextState)
{
secondsPassed = buttonTimer.read();
if(state != STATE_ALARM && secondsPassed > START_ALARM_S)
{
wasButtPressed = true;
buttonTimer.stop();
buttonTimer.reset();
nextState = true;
}
else if(state == STATE_ALARM && secondsPassed > STOP_ALARM_S)
{
longPress = true;
buttonTimer.stop();
buttonTimer.reset();
nextState = true;
}
}
}
}
void ledBlinky()
{
while(!gotGnssFlag)
{
redLed = !redLed;
greenLed = !greenLed;
Thread::wait(1000);
}
}
int main()
{
bool success = false;
MainStates nextState = STATE_IDLE;
my_bsp_init();
buttonInt.rise(buttonRiseHandler);
printf("Initialising UART for modem communication: ");
fh = new UARTSerial(MDMTXD, MDMRXD, 9600);
printf("...done\r\n");
printf("Initialising the modem AT command parser: ");
at = new ATCmdParser(fh, OUTPUT_ENTER_KEY, AT_PARSER_BUFFER_SIZE,
AT_PARSER_TIMEOUT, false);
printf("...done\r\n");
gnssPower = 1;
ledState.start(ledBlinky);
if(gnss.init())
{
printf("Cold start... waiting to get first location data\r\n");
getGPSData(locationGlobal, &gnss);
printf("I have the location.\r\n");
gotGnssFlag = true;
ledState.terminate();
// Turn green led only
greenLed = 0;
redLed = 1;
}
else
{
printf("Unable to initialise GNSS.\r\n");
}
greenLed = 1;
blueLed = 0;
Udp udp("52.215.10.12", 3334);
UBloxSara sara(at, udp);
printf("Initializing the modem: \r\n");
sara.setup();
printf("done...\r\n");
sara.connectNB();
myParams_t myParams;
myParams.gnss = &gnss;
myParams.sara = &sara;
timerThread.start(timerCallback);
idleState.start(idleCallback);
alarmState.start(callback(alarmCallback, &myParams));
alarmOffState.start(alarmOffCallback);
movementState.start(movementCallback);
gnssLocation.start(callback(gnssLocationCallback, &gnss));
char commandbuffer[100];
while(1)
{
switch(state)
{
case STATE_IDLE:
if(wasAccInt)
{
wasAccInt = false;
nextState = STATE_LIS_DETECTION;
}
if(wasButtPressed)
{
wasButtPressed = false;
nextState = STATE_ALARM;
alarmState.signal_set(ALARM_SIGNAL);
greenLed = 1;
redLed = 0;
blueLed = 1;
}
break;
case STATE_ALARM:
if(longPress)
{
redLed = 1;
longPress = false;
nextState = STATE_ALARM_OFF;
alarmOffState.signal_set(ALARM_OFF_SIGNAL);
}
else
{
alarm = 1;
}
break;
case STATE_ALARM_OFF:
nextState = STATE_IDLE;
idleState.signal_set(IDLE_SIGNAL);
alarm = 0;
blueLed = 0;
break;
case STATE_LIS_DETECTION:
break;
}
state = nextState;
wait_ms(125);
}
}
