mirror of
https://github.com/peterantypas/maiana.git
synced 2025-05-29 05:40:15 -07:00
Rudimentary serial commands for web API integration
This commit is contained in:
parent
33b02d07eb
commit
4ca6cddf9e
@ -171,7 +171,7 @@
|
|||||||
</fileInfo>
|
</fileInfo>
|
||||||
<sourceEntries>
|
<sourceEntries>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
||||||
<entry excluding="src/stm32f3-stdperiph/stm32f30x_wwdg.c|src/stm32f3-stdperiph/stm32f30x_rtc.c|src/stm32f3-stdperiph/stm32f30x_pwr.c|src/stm32f3-stdperiph/stm32f30x_opamp.c|src/stm32f3-stdperiph/stm32f30x_flash.c|src/stm32f3-stdperiph/stm32f30x_dma.c|src/stm32f3-stdperiph/stm32f30x_dbgmcu.c|src/stm32f3-stdperiph/stm32f30x_dac.c|src/stm32f3-stdperiph/stm32f30x_crc.c|src/stm32f3-stdperiph/stm32f30x_comp.c|src/stm32f3-stdperiph/stm32f30x_can.c|src/stm32f3-stdperiph/stm32f30x_adc.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="system"/>
|
<entry excluding="src/stm32f3-stdperiph/stm32f30x_wwdg.c|src/stm32f3-stdperiph/stm32f30x_rtc.c|src/stm32f3-stdperiph/stm32f30x_pwr.c|src/stm32f3-stdperiph/stm32f30x_opamp.c|src/stm32f3-stdperiph/stm32f30x_dma.c|src/stm32f3-stdperiph/stm32f30x_dbgmcu.c|src/stm32f3-stdperiph/stm32f30x_dac.c|src/stm32f3-stdperiph/stm32f30x_crc.c|src/stm32f3-stdperiph/stm32f30x_comp.c|src/stm32f3-stdperiph/stm32f30x_can.c|src/stm32f3-stdperiph/stm32f30x_adc.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="system"/>
|
||||||
</sourceEntries>
|
</sourceEntries>
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
@ -333,7 +333,7 @@
|
|||||||
</fileInfo>
|
</fileInfo>
|
||||||
<sourceEntries>
|
<sourceEntries>
|
||||||
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
|
||||||
<entry excluding="src/stm32f3-stdperiph/stm32f30x_wwdg.c|src/stm32f3-stdperiph/stm32f30x_rtc.c|src/stm32f3-stdperiph/stm32f30x_pwr.c|src/stm32f3-stdperiph/stm32f30x_opamp.c|src/stm32f3-stdperiph/stm32f30x_flash.c|src/stm32f3-stdperiph/stm32f30x_dma.c|src/stm32f3-stdperiph/stm32f30x_dbgmcu.c|src/stm32f3-stdperiph/stm32f30x_dac.c|src/stm32f3-stdperiph/stm32f30x_crc.c|src/stm32f3-stdperiph/stm32f30x_comp.c|src/stm32f3-stdperiph/stm32f30x_can.c|src/stm32f3-stdperiph/stm32f30x_adc.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="system"/>
|
<entry excluding="src/stm32f3-stdperiph/stm32f30x_wwdg.c|src/stm32f3-stdperiph/stm32f30x_rtc.c|src/stm32f3-stdperiph/stm32f30x_pwr.c|src/stm32f3-stdperiph/stm32f30x_opamp.c|src/stm32f3-stdperiph/stm32f30x_dma.c|src/stm32f3-stdperiph/stm32f30x_dbgmcu.c|src/stm32f3-stdperiph/stm32f30x_dac.c|src/stm32f3-stdperiph/stm32f30x_crc.c|src/stm32f3-stdperiph/stm32f30x_comp.c|src/stm32f3-stdperiph/stm32f30x_can.c|src/stm32f3-stdperiph/stm32f30x_adc.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="system"/>
|
||||||
</sourceEntries>
|
</sourceEntries>
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
|
12
application/Release/deploy.sh
Normal file
12
application/Release/deploy.sh
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
BIN=ais_transponder.bin
|
||||||
|
|
||||||
|
# Write the metadata first, before any reset
|
||||||
|
|
||||||
|
|
||||||
|
if [ $? -eq 0 ] then
|
||||||
|
st-flash write $BIN 0x08004000
|
||||||
|
else
|
||||||
|
echo "Flashing failed"
|
||||||
|
fi
|
@ -9,6 +9,7 @@ C_SRCS += \
|
|||||||
CPP_SRCS += \
|
CPP_SRCS += \
|
||||||
../src/AISMessages.cpp \
|
../src/AISMessages.cpp \
|
||||||
../src/ChannelManager.cpp \
|
../src/ChannelManager.cpp \
|
||||||
|
../src/CommandProcessor.cpp \
|
||||||
../src/DataTerminal.cpp \
|
../src/DataTerminal.cpp \
|
||||||
../src/DebugPrinter.cpp \
|
../src/DebugPrinter.cpp \
|
||||||
../src/EEPROM.cpp \
|
../src/EEPROM.cpp \
|
||||||
@ -35,6 +36,7 @@ CPP_SRCS += \
|
|||||||
OBJS += \
|
OBJS += \
|
||||||
./src/AISMessages.o \
|
./src/AISMessages.o \
|
||||||
./src/ChannelManager.o \
|
./src/ChannelManager.o \
|
||||||
|
./src/CommandProcessor.o \
|
||||||
./src/DataTerminal.o \
|
./src/DataTerminal.o \
|
||||||
./src/DebugPrinter.o \
|
./src/DebugPrinter.o \
|
||||||
./src/EEPROM.o \
|
./src/EEPROM.o \
|
||||||
@ -65,6 +67,7 @@ C_DEPS += \
|
|||||||
CPP_DEPS += \
|
CPP_DEPS += \
|
||||||
./src/AISMessages.d \
|
./src/AISMessages.d \
|
||||||
./src/ChannelManager.d \
|
./src/ChannelManager.d \
|
||||||
|
./src/CommandProcessor.d \
|
||||||
./src/DataTerminal.d \
|
./src/DataTerminal.d \
|
||||||
./src/DebugPrinter.d \
|
./src/DebugPrinter.d \
|
||||||
./src/EEPROM.d \
|
./src/EEPROM.d \
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
# Add inputs and outputs from these tool invocations to the build variables
|
# Add inputs and outputs from these tool invocations to the build variables
|
||||||
C_SRCS += \
|
C_SRCS += \
|
||||||
../system/src/stm32f3-stdperiph/stm32f30x_exti.c \
|
../system/src/stm32f3-stdperiph/stm32f30x_exti.c \
|
||||||
|
../system/src/stm32f3-stdperiph/stm32f30x_flash.c \
|
||||||
../system/src/stm32f3-stdperiph/stm32f30x_gpio.c \
|
../system/src/stm32f3-stdperiph/stm32f30x_gpio.c \
|
||||||
../system/src/stm32f3-stdperiph/stm32f30x_i2c.c \
|
../system/src/stm32f3-stdperiph/stm32f30x_i2c.c \
|
||||||
../system/src/stm32f3-stdperiph/stm32f30x_iwdg.c \
|
../system/src/stm32f3-stdperiph/stm32f30x_iwdg.c \
|
||||||
@ -17,6 +18,7 @@ C_SRCS += \
|
|||||||
|
|
||||||
OBJS += \
|
OBJS += \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_exti.o \
|
./system/src/stm32f3-stdperiph/stm32f30x_exti.o \
|
||||||
|
./system/src/stm32f3-stdperiph/stm32f30x_flash.o \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_gpio.o \
|
./system/src/stm32f3-stdperiph/stm32f30x_gpio.o \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_i2c.o \
|
./system/src/stm32f3-stdperiph/stm32f30x_i2c.o \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_iwdg.o \
|
./system/src/stm32f3-stdperiph/stm32f30x_iwdg.o \
|
||||||
@ -29,6 +31,7 @@ OBJS += \
|
|||||||
|
|
||||||
C_DEPS += \
|
C_DEPS += \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_exti.d \
|
./system/src/stm32f3-stdperiph/stm32f30x_exti.d \
|
||||||
|
./system/src/stm32f3-stdperiph/stm32f30x_flash.d \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_gpio.d \
|
./system/src/stm32f3-stdperiph/stm32f30x_gpio.d \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_i2c.d \
|
./system/src/stm32f3-stdperiph/stm32f30x_i2c.d \
|
||||||
./system/src/stm32f3-stdperiph/stm32f30x_iwdg.d \
|
./system/src/stm32f3-stdperiph/stm32f30x_iwdg.d \
|
||||||
|
268
application/src/CommandProcessor.cpp
Normal file
268
application/src/CommandProcessor.cpp
Normal file
@ -0,0 +1,268 @@
|
|||||||
|
/*
|
||||||
|
* CommandProcessor.cpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 24, 2016
|
||||||
|
* Author: peter
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "CommandProcessor.hpp"
|
||||||
|
#include <cstring>
|
||||||
|
#include "EEPROM.hpp"
|
||||||
|
#include <cstdio>
|
||||||
|
#include "globals.h"
|
||||||
|
#include "stm32f30x.h"
|
||||||
|
|
||||||
|
|
||||||
|
CommandProcessor &CommandProcessor::instance()
|
||||||
|
{
|
||||||
|
static CommandProcessor __instance;
|
||||||
|
return __instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
CommandProcessor::CommandProcessor()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::init()
|
||||||
|
{
|
||||||
|
EventQueue::instance().addObserver(this, REQUEST_EVENT|RESET_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::processEvent(const Event &e)
|
||||||
|
{
|
||||||
|
if ( e.type == RESET_EVENT ) {
|
||||||
|
NVIC_SystemReset ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(e.request.operation) {
|
||||||
|
case OP_GET:
|
||||||
|
if ( strcmp(e.request.field, "mmsi") == 0 )
|
||||||
|
returnMMSI();
|
||||||
|
else if ( strcmp(e.request.field, "name") == 0 )
|
||||||
|
returnName();
|
||||||
|
else if ( strcmp(e.request.field, "callsign") == 0 )
|
||||||
|
returnCallSign();
|
||||||
|
else if ( strcmp(e.request.field, "beam") == 0 )
|
||||||
|
returnBeam();
|
||||||
|
else if ( strcmp(e.request.field, "length") == 0 )
|
||||||
|
returnLength();
|
||||||
|
else if ( strcmp(e.request.field, "mode") == 0 )
|
||||||
|
returnMode();
|
||||||
|
else if ( strcmp(e.request.field, "vesseldata") == 0 )
|
||||||
|
returnVesselData();
|
||||||
|
else if ( strcmp(e.request.field, "version") == 0 )
|
||||||
|
returnVersion();
|
||||||
|
else if ( strcmp(e.request.field, "status") == 0 )
|
||||||
|
returnStatus();
|
||||||
|
else
|
||||||
|
sendError("Unknown field");
|
||||||
|
break;
|
||||||
|
case OP_SET:
|
||||||
|
if ( strcmp(e.request.field, "mmsi") == 0 )
|
||||||
|
setMMSI(atoi(e.request.value));
|
||||||
|
else if ( strcmp(e.request.field, "name") == 0 )
|
||||||
|
setName(e.request.value);
|
||||||
|
else if ( strcmp(e.request.field, "callsign") == 0 )
|
||||||
|
setCallSign(e.request.value);
|
||||||
|
else if ( strcmp(e.request.field, "beam") == 0 )
|
||||||
|
setBeam(atoi(e.request.value));
|
||||||
|
else if ( strcmp(e.request.field, "length") == 0 )
|
||||||
|
setLength(atoi(e.request.value));
|
||||||
|
else if ( strcmp(e.request.field, "mode") == 0 )
|
||||||
|
setMode(e.request.value);
|
||||||
|
else if ( strcmp(e.request.field, "vesseldata") == 0 )
|
||||||
|
setVesselData(e.request.value);
|
||||||
|
else
|
||||||
|
sendError("Unknown field");
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::sendError(const char *err)
|
||||||
|
{
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = false;
|
||||||
|
strcpy(reply->response.data, err);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::sendEmptyReply(bool success)
|
||||||
|
{
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = success;
|
||||||
|
reply->response.data[0] = 0;
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnVersion()
|
||||||
|
{
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = true;
|
||||||
|
strcpy(reply->response.data, REVISION);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnMMSI()
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = true;
|
||||||
|
sprintf(reply->response.data, "%lu", data.mmsi);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnCallSign()
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = true;
|
||||||
|
sprintf(reply->response.data, "%s", data.callsign);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnName()
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = true;
|
||||||
|
sprintf(reply->response.data, "%s", data.name);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnBeam()
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = true;
|
||||||
|
sprintf(reply->response.data, "%d", data.beam);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnLength()
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = true;
|
||||||
|
sprintf(reply->response.data, "%d", data.len);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnMode()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnVesselData()
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
|
||||||
|
Event *reply = EventPool::instance().newEvent(RESPONSE_EVENT);
|
||||||
|
reply->response.success = true;
|
||||||
|
|
||||||
|
sprintf(reply->response.data, "%lu,%s,%s,%d,%d", data.mmsi, data.name, data.callsign, data.beam, data.len);
|
||||||
|
EventQueue::instance().push(reply);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::returnStatus()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::setMMSI(uint32_t mmsi)
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
data.mmsi = mmsi;
|
||||||
|
EEPROM::instance().writeStationData(data);
|
||||||
|
sendEmptyReply(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::setName(const char* name)
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
strcpy(data.name, name);
|
||||||
|
EEPROM::instance().writeStationData(data);
|
||||||
|
sendEmptyReply(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::setCallSign(const char *callsign)
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
strcpy(data.callsign, callsign);
|
||||||
|
EEPROM::instance().writeStationData(data);
|
||||||
|
sendEmptyReply(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::setBeam(uint8_t beam)
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
data.beam = beam;
|
||||||
|
EEPROM::instance().writeStationData(data);
|
||||||
|
sendEmptyReply(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::setLength(uint8_t len)
|
||||||
|
{
|
||||||
|
StationData data;
|
||||||
|
EEPROM::instance().readStationData(data);
|
||||||
|
data.len = len;
|
||||||
|
EEPROM::instance().writeStationData(data);
|
||||||
|
sendEmptyReply(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::setVesselData(const char *data)
|
||||||
|
{
|
||||||
|
sendEmptyReply(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CommandProcessor::setMode(const char *mode)
|
||||||
|
{
|
||||||
|
if (strcmp (mode, "dfu") == 0)
|
||||||
|
{
|
||||||
|
FLASH_Unlock ();
|
||||||
|
FLASH_Status status = FLASH_WaitForLastOperation (FLASH_ER_PRG_TIMEOUT);
|
||||||
|
if ( status != FLASH_COMPLETE ) {
|
||||||
|
sendError("Unable to unlock flash");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLASH_ErasePage (METADATA_ADDRESS);
|
||||||
|
status = FLASH_WaitForLastOperation (FLASH_ER_PRG_TIMEOUT);
|
||||||
|
if ( status != FLASH_COMPLETE ) {
|
||||||
|
sendError("Unable to erase metadata page");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FLASH_Lock ();
|
||||||
|
FLASH_WaitForLastOperation (FLASH_ER_PRG_TIMEOUT);
|
||||||
|
if ( status != FLASH_COMPLETE ) {
|
||||||
|
sendError("Unable to lock flash");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//sendEmptyReply (true);
|
||||||
|
Event *e = EventPool::instance().newEvent(RESET_EVENT);
|
||||||
|
EventQueue::instance().push(e);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sendError("Unrecognized mode");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
46
application/src/CommandProcessor.hpp
Normal file
46
application/src/CommandProcessor.hpp
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* CommandProcessor.hpp
|
||||||
|
*
|
||||||
|
* Created on: Jun 24, 2016
|
||||||
|
* Author: peter
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef COMMANDPROCESSOR_HPP_
|
||||||
|
#define COMMANDPROCESSOR_HPP_
|
||||||
|
|
||||||
|
#include "EventQueue.hpp"
|
||||||
|
|
||||||
|
class CommandProcessor : public EventConsumer
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static CommandProcessor &instance();
|
||||||
|
|
||||||
|
void init();
|
||||||
|
void processEvent(const Event &);
|
||||||
|
private:
|
||||||
|
CommandProcessor();
|
||||||
|
|
||||||
|
void returnMMSI();
|
||||||
|
void returnName();
|
||||||
|
void returnCallSign();
|
||||||
|
void returnBeam();
|
||||||
|
void returnLength();
|
||||||
|
void returnMode();
|
||||||
|
void returnVesselData();
|
||||||
|
void returnStatus();
|
||||||
|
void returnVersion();
|
||||||
|
|
||||||
|
|
||||||
|
void setMMSI(uint32_t mmsi);
|
||||||
|
void setName(const char* name);
|
||||||
|
void setCallSign(const char *callsign);
|
||||||
|
void setBeam(uint8_t beam);
|
||||||
|
void setLength(uint8_t len);
|
||||||
|
void setVesselData(const char *data);
|
||||||
|
void setMode(const char *mode);
|
||||||
|
|
||||||
|
void sendError(const char* err);
|
||||||
|
void sendEmptyReply(bool success);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* COMMANDPROCESSOR_HPP_ */
|
@ -86,7 +86,7 @@ void DataTerminal::processEvent(const Event &e)
|
|||||||
|
|
||||||
void DataTerminal::processCharacter(char c)
|
void DataTerminal::processCharacter(char c)
|
||||||
{
|
{
|
||||||
if ( c == 13 ) {
|
if ( c == '\n' ) {
|
||||||
mCmdBuffer[mCmdBuffPos] = 0;
|
mCmdBuffer[mCmdBuffPos] = 0;
|
||||||
mCmdBuffPos = 0;
|
mCmdBuffPos = 0;
|
||||||
processCommand();
|
processCommand();
|
||||||
@ -104,22 +104,26 @@ void DataTerminal::processCommand()
|
|||||||
string s(mCmdBuffer);
|
string s(mCmdBuffer);
|
||||||
Utils::trim(s);
|
Utils::trim(s);
|
||||||
Utils::tokenize(s, ' ', mCmdTokens);
|
Utils::tokenize(s, ' ', mCmdTokens);
|
||||||
|
printf2("Got command: %s\r\n", s.c_str());
|
||||||
|
|
||||||
if ( mCmdTokens[0] == "set" && mCmdTokens.size() >= 3 ) {
|
if ( mCmdTokens[0] == "set" && mCmdTokens.size() >= 2 ) {
|
||||||
// TODO: Extract field and value and queue a command event
|
|
||||||
Event *e = EventPool::instance().newEvent(REQUEST_EVENT);
|
Event *e = EventPool::instance().newEvent(REQUEST_EVENT);
|
||||||
e->request.operation = OP_SET;
|
e->request.operation = OP_SET;
|
||||||
strncpy(e->request.field, mCmdTokens[1].c_str(), sizeof e->request.field);
|
strncpy(e->request.field, mCmdTokens[1].c_str(), sizeof e->request.field);
|
||||||
strncpy(e->request.value, mCmdTokens[2].c_str(), sizeof e->request.value);
|
if ( mCmdTokens.size() > 2 )
|
||||||
|
strncpy(e->request.value, mCmdTokens[2].c_str(), sizeof e->request.value);
|
||||||
|
else
|
||||||
|
e->request.value[0] = 0;
|
||||||
|
|
||||||
EventQueue::instance().push(e);
|
EventQueue::instance().push(e);
|
||||||
}
|
}
|
||||||
else if ( mCmdTokens[0] == "get" && mCmdTokens.size() >= 2 ) {
|
else if ( mCmdTokens[0] == "get" && mCmdTokens.size() >= 2 ) {
|
||||||
// TODO: Extract field
|
|
||||||
Event *e = EventPool::instance().newEvent(REQUEST_EVENT);
|
Event *e = EventPool::instance().newEvent(REQUEST_EVENT);
|
||||||
e->request.operation = OP_GET;
|
e->request.operation = OP_GET;
|
||||||
strncpy(e->request.field, mCmdTokens[1].c_str(), sizeof e->request.field);
|
strncpy(e->request.field, mCmdTokens[1].c_str(), sizeof e->request.field);
|
||||||
EventQueue::instance().push(e);
|
EventQueue::instance().push(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void write_char(USART_TypeDef* USARTx, char c)
|
void write_char(USART_TypeDef* USARTx, char c)
|
||||||
|
@ -15,18 +15,17 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UNKNOWN_EVENT = 0, // Invalid, not a real event id
|
UNKNOWN_EVENT = 0x0000, // Invalid, not a real event id
|
||||||
GPS_NMEA_SENTENCE = 1, // A NMEA sentence was received from the GPS.
|
GPS_NMEA_SENTENCE = 0x0001, // A NMEA sentence was received from the GPS.
|
||||||
GPS_FIX_EVENT = 2, // The GPS obtained a fix.
|
GPS_FIX_EVENT = 0x0002, // The GPS obtained a fix.
|
||||||
CLOCK_EVENT = 4, // One pulse per second as triggered by GPS. This is a convenient 1 Hz "wall" clock, as it carries UTC.
|
CLOCK_EVENT = 0x0004, // One pulse per second as triggered by GPS. This is a convenient 1 Hz "wall" clock, as it carries UTC.
|
||||||
AIS_PACKET_EVENT = 8, // A packet was just decoded (not necessarily valid, must still be CRC checked, etc)
|
AIS_PACKET_EVENT = 0x0008, // A packet was just decoded (not necessarily valid, must still be CRC checked, etc)
|
||||||
INTERROGATION_EVENT = 16,
|
INTERROGATION_EVENT = 0x0010, // Received AIS message 15
|
||||||
DEBUG_EVENT = 32,
|
DEBUG_EVENT = 0x0020,
|
||||||
KEYPRESS_EVENT = 64,
|
KEYPRESS_EVENT = 0x0040,
|
||||||
REQUEST_EVENT = 128,
|
REQUEST_EVENT = 0x0080,
|
||||||
RESPONSE_EVENT = 256
|
RESPONSE_EVENT = 0x00100,
|
||||||
//GPS_ERROR_EVENT = 64, // A GPS failure
|
RESET_EVENT = 0x00200
|
||||||
//TRX_ERROR_EVENT = 128 // A radio failure
|
|
||||||
}
|
}
|
||||||
EventType;
|
EventType;
|
||||||
|
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "TXPowerSettings.h"
|
#include "TXPowerSettings.h"
|
||||||
|
|
||||||
#define MODEL "SEAWAIS_02"
|
#define MODEL "SEAWAIS_02"
|
||||||
#define REVISION "0.6.0"
|
#define REVISION "0.6.2"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -89,4 +89,7 @@
|
|||||||
*/
|
*/
|
||||||
#define MULTIPLEXED_OUTPUT 1
|
#define MULTIPLEXED_OUTPUT 1
|
||||||
|
|
||||||
|
#define METADATA_ADDRESS 0x08003800
|
||||||
|
#define APPLICATION_ADDRESS 0x08004000
|
||||||
|
|
||||||
#endif /* GLOBALS_H_ */
|
#endif /* GLOBALS_H_ */
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "TXScheduler.hpp"
|
#include "TXScheduler.hpp"
|
||||||
#include "DebugPrinter.hpp"
|
#include "DebugPrinter.hpp"
|
||||||
#include "EEPROM.hpp"
|
#include "EEPROM.hpp"
|
||||||
|
#include "CommandProcessor.hpp"
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
@ -61,12 +62,14 @@ main(int argc, char* argv[])
|
|||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
// Disable buffered memory writes to debug imprecise bus faults
|
// Disable buffered memory writes to debug imprecise bus faults
|
||||||
SCnSCB->ACTLR |= SCnSCB_ACTLR_DISDEFWBUF_Msk;
|
SCnSCB->ACTLR |= SCnSCB_ACTLR_DISDEFWBUF_Msk;
|
||||||
trace_printf("ACTLR: %.8x\n", SCnSCB->ACTLR);
|
//trace_printf("ACTLR: %.8x\n", SCnSCB->ACTLR);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
printf2("Software revision: %s\r\n", REVISION);
|
||||||
|
|
||||||
EEPROM::instance().init();
|
EEPROM::instance().init();
|
||||||
/*
|
/*
|
||||||
|
* TODO: Move this out of here
|
||||||
struct StationData __d;
|
struct StationData __d;
|
||||||
__d.mmsi = 987654321;
|
__d.mmsi = 987654321;
|
||||||
__d.len = 0;
|
__d.len = 0;
|
||||||
@ -79,7 +82,7 @@ main(int argc, char* argv[])
|
|||||||
EventQueue::instance().init();
|
EventQueue::instance().init();
|
||||||
EventPool::instance().init();
|
EventPool::instance().init();
|
||||||
TXPacketPool::instance().init();
|
TXPacketPool::instance().init();
|
||||||
|
CommandProcessor::instance().init();
|
||||||
|
|
||||||
LEDManager::instance().clear();
|
LEDManager::instance().clear();
|
||||||
TXScheduler txScheduler;
|
TXScheduler txScheduler;
|
||||||
@ -124,9 +127,6 @@ main(int argc, char* argv[])
|
|||||||
EventQueue::instance().dispatch();
|
EventQueue::instance().dispatch();
|
||||||
IWDG_ReloadCounter();
|
IWDG_ReloadCounter();
|
||||||
}
|
}
|
||||||
|
|
||||||
// If execution jumps here, something is seriously fucked up!!!
|
|
||||||
assert(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -70,7 +70,7 @@ void DataTerminal::init()
|
|||||||
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
|
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
|
||||||
NVIC_Init(&NVIC_InitStruct);
|
NVIC_Init(&NVIC_InitStruct);
|
||||||
|
|
||||||
//write("[SYSTEM][Waiting for transfer]\r\n");
|
write("[DFU]Waiting for transfer\r\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
DataTerminal::DataTerminal()
|
DataTerminal::DataTerminal()
|
||||||
@ -208,7 +208,7 @@ void DataTerminal::unlockFlash()
|
|||||||
trace_printf("Mock flash unlock\n");
|
trace_printf("Mock flash unlock\n");
|
||||||
#else
|
#else
|
||||||
FLASH_Unlock();
|
FLASH_Unlock();
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,7 +218,7 @@ void DataTerminal::lockFlash()
|
|||||||
trace_printf("Mock flash lock\n");
|
trace_printf("Mock flash lock\n");
|
||||||
#else
|
#else
|
||||||
FLASH_Lock();
|
FLASH_Lock();
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -230,11 +230,11 @@ void DataTerminal::flushPage()
|
|||||||
#else
|
#else
|
||||||
trace_printf("Writing Flash page at %.8x\n", mWriteAddress);
|
trace_printf("Writing Flash page at %.8x\n", mWriteAddress);
|
||||||
FLASH_ErasePage(mWriteAddress);
|
FLASH_ErasePage(mWriteAddress);
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
char *p = mCurrPage;
|
char *p = mCurrPage;
|
||||||
for ( size_t i = 0; i < FLASH_PAGE_SIZE; i += 4, p += 4) {
|
for ( size_t i = 0; i < FLASH_PAGE_SIZE; i += 4, p += 4) {
|
||||||
FLASH_ProgramWord(mWriteAddress + i, *(uint32_t*)p);
|
FLASH_ProgramWord(mWriteAddress + i, *(uint32_t*)p);
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
}
|
}
|
||||||
|
|
||||||
trace_printf("Wrote Flash page at %.8x\n", mWriteAddress);
|
trace_printf("Wrote Flash page at %.8x\n", mWriteAddress);
|
||||||
@ -249,11 +249,11 @@ void DataTerminal::flushMetadata()
|
|||||||
trace_printf("Mock write for metadata page at %.8x\n", METADATA_ADDRESS);
|
trace_printf("Mock write for metadata page at %.8x\n", METADATA_ADDRESS);
|
||||||
#else
|
#else
|
||||||
FLASH_ErasePage(METADATA_ADDRESS);
|
FLASH_ErasePage(METADATA_ADDRESS);
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
char *p = (char*)&mMetadata;
|
char *p = (char*)&mMetadata;
|
||||||
for ( size_t i = 0; i < sizeof mMetadata; i += 4, p += 4 ) {
|
for ( size_t i = 0; i < sizeof mMetadata; i += 4, p += 4 ) {
|
||||||
FLASH_ProgramWord(METADATA_ADDRESS + i, *(uint32_t*)p);
|
FLASH_ProgramWord(METADATA_ADDRESS + i, *(uint32_t*)p);
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -50,12 +50,11 @@ Timer __timer;
|
|||||||
void erase()
|
void erase()
|
||||||
{
|
{
|
||||||
FLASH_Unlock();
|
FLASH_Unlock();
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
FLASH_ErasePage(METADATA_ADDRESS);
|
FLASH_ErasePage(METADATA_ADDRESS);
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
FLASH_Lock();
|
FLASH_Lock();
|
||||||
FLASH_WaitForLastOperation(0);
|
FLASH_WaitForLastOperation(FLASH_ER_PRG_TIMEOUT);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
@ -74,13 +73,15 @@ main(int argc, char* argv[])
|
|||||||
enterUARTMode();
|
enterUARTMode();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
else {
|
else {
|
||||||
|
|
||||||
if ( !verifyApplicationChecksum(*metadata) ) {
|
if ( !verifyApplicationChecksum(*metadata) ) {
|
||||||
trace_printf("The software is corrupt. Entering UART mode\n");
|
trace_printf("The software is corrupt. Entering UART mode\n");
|
||||||
enterUARTMode();
|
enterUARTMode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
trace_printf("Found software rev. %s\n", metadata->revision);
|
trace_printf("Found software rev. %s\n", metadata->revision);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user