Serial Communication Framework
This commit is contained in:
parent
d75f1d6f94
commit
eb131bd020
@ -1,8 +1,8 @@
|
|||||||
#include "ConfigManager.h"
|
#include "ConfigManager.h"
|
||||||
|
|
||||||
void ConfigManager::Init(VFileSystem* fs)
|
int ConfigManager::Init(VFileSystem* fs)
|
||||||
{
|
{
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ConfigManager::ReadId(char* id)
|
int ConfigManager::ReadId(char* id)
|
||||||
|
@ -13,7 +13,7 @@ struct DeviceConfig
|
|||||||
class ConfigManager
|
class ConfigManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
void Init(VFileSystem* fs);
|
int Init(VFileSystem* fs);
|
||||||
int ReadId(char* id);
|
int ReadId(char* id);
|
||||||
int SetId(char* id);
|
int SetId(char* id);
|
||||||
int ReadConfig(DeviceConfig& config);
|
int ReadConfig(DeviceConfig& config);
|
||||||
|
84
lib/InterSerial/InterSerial.cpp
Normal file
84
lib/InterSerial/InterSerial.cpp
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#include "InterSerial.h"
|
||||||
|
|
||||||
|
#define MAX_CMD_LEN 200
|
||||||
|
|
||||||
|
void InterSerial::Init(DataRecorder* r, ConfigManager* c)
|
||||||
|
{
|
||||||
|
Serial1.begin(115200);
|
||||||
|
cmdLine = "";
|
||||||
|
rec = r;
|
||||||
|
cfg = c;
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterSerial::Process()
|
||||||
|
{
|
||||||
|
while (Serial1.available()) {
|
||||||
|
ringBuffer.push(Serial1.read());
|
||||||
|
}
|
||||||
|
|
||||||
|
while (ringBuffer.size() > 0) {
|
||||||
|
if (cmdLine.endsWith("\r\n")) {
|
||||||
|
cmdLine.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t readByte;
|
||||||
|
ringBuffer.pop(readByte);
|
||||||
|
if (cmdLine.isEmpty() && isspace(readByte)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
cmdLine += (char)readByte;
|
||||||
|
|
||||||
|
if (cmdLine.length() > MAX_CMD_LEN) {
|
||||||
|
Serial1.println("Command too long, max 200 bytes");
|
||||||
|
cmdLine.clear();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (cmdLine.endsWith("\r\n")) {
|
||||||
|
if (cmdLine.startsWith("AT")) {
|
||||||
|
CmdHandler(cmdLine);
|
||||||
|
} else {
|
||||||
|
Serial1.println("Command should start with AT");
|
||||||
|
cmdLine.clear();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterSerial::CmdHandler(String cmdLine)
|
||||||
|
{
|
||||||
|
if (cmdLine == "AT\r\n") {
|
||||||
|
Serial1.println("OK");
|
||||||
|
} else if (cmdLine.length() <= 5) {
|
||||||
|
Serial1.println("Bad Command");
|
||||||
|
} else if (cmdLine[strlen("AT")] != '+') {
|
||||||
|
Serial1.println("Bad Command");
|
||||||
|
} else {
|
||||||
|
String realCmd = cmdLine.substring(3, cmdLine.length() - 2);
|
||||||
|
ParseCmd(realCmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterSerial::ParseCmd(String cmd)
|
||||||
|
{
|
||||||
|
if (cmd == "DEVIDREAD") {
|
||||||
|
|
||||||
|
} else if (cmd == "SYSCFGREAD") {
|
||||||
|
|
||||||
|
} else if (cmd.startsWith("DEVIDSET") && cmd[strlen("DEVIDSET")] == '=') {
|
||||||
|
cmd.substring(strlen("DEVIDSET") + 1);
|
||||||
|
|
||||||
|
} else if (cmd.startsWith("SYSCFGSET") && cmd[strlen("SYSCFGSET")] == '=') {
|
||||||
|
cmd.substring(strlen("SYSCFGSET") + 1);
|
||||||
|
|
||||||
|
} else if (cmd.startsWith("MSGSTORE") && cmd[strlen("MSGSTORE")] == '=') {
|
||||||
|
cmd.substring(strlen("MSGSTORE") + 1);
|
||||||
|
|
||||||
|
} else if (cmd == "MSGREAD=?") {
|
||||||
|
|
||||||
|
} else if (cmd == "MSGDUMP") {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
Serial1.println("Bad Command");
|
||||||
|
}
|
||||||
|
}
|
24
lib/InterSerial/InterSerial.h
Normal file
24
lib/InterSerial/InterSerial.h
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Arduino.h>
|
||||||
|
#include <RingBuf.h>
|
||||||
|
#include "DataRecorder.h"
|
||||||
|
#include "ConfigManager.h"
|
||||||
|
|
||||||
|
|
||||||
|
class InterSerial
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Init(DataRecorder* rec, ConfigManager* cfg);
|
||||||
|
void Process();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void CmdHandler(String cmdLine);
|
||||||
|
void ParseCmd(String cmd);
|
||||||
|
|
||||||
|
private:
|
||||||
|
RingBuf<uint8_t, 256> ringBuffer;
|
||||||
|
String cmdLine;
|
||||||
|
DataRecorder* rec;
|
||||||
|
ConfigManager* cfg;
|
||||||
|
};
|
@ -16,3 +16,4 @@ board_upload.flash_size = 16MB
|
|||||||
board_build.partitions = partitions_12M_SPIFFS.csv
|
board_build.partitions = partitions_12M_SPIFFS.csv
|
||||||
framework = arduino
|
framework = arduino
|
||||||
upload_port = COM8
|
upload_port = COM8
|
||||||
|
lib_deps = locoduino/RingBuffer@^1.0.4
|
||||||
|
18
src/main.cpp
18
src/main.cpp
@ -4,31 +4,29 @@
|
|||||||
#include "VFileSystem.h"
|
#include "VFileSystem.h"
|
||||||
#include "ConfigManager.h"
|
#include "ConfigManager.h"
|
||||||
#include "DataRecorder.h"
|
#include "DataRecorder.h"
|
||||||
|
#include "InterSerial.h"
|
||||||
|
|
||||||
VFileSystem fs;
|
VFileSystem fs;
|
||||||
ConfigManager cfg;
|
ConfigManager cfg;
|
||||||
DataRecorder dataRec;
|
DataRecorder dataRec;
|
||||||
|
InterSerial interSerial;
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
Serial1.begin(115200);
|
|
||||||
Serial1.println("Begin...");
|
|
||||||
|
|
||||||
if (fs.Init()) {
|
if (fs.Init()) {
|
||||||
Serial1.println("FS Init Failed.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (cfg.Init(&fs)) {
|
||||||
cfg.Init(&fs);
|
return;
|
||||||
|
}
|
||||||
if (dataRec.Init(&fs)) {
|
if (dataRec.Init(&fs)) {
|
||||||
Serial1.println("DataRecorder Init Failed.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
interSerial.Init(&dataRec, &cfg);
|
||||||
Serial1.println("End.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop()
|
void loop()
|
||||||
{
|
{
|
||||||
|
interSerial.Process();
|
||||||
|
delay(10);
|
||||||
}
|
}
|
@ -1,3 +1,8 @@
|
|||||||
|
import os
|
||||||
|
|
||||||
|
if not os.path.exists('../data'):
|
||||||
|
os.makedirs('../data')
|
||||||
|
|
||||||
for i in range(1024):
|
for i in range(1024):
|
||||||
with open(f"../data/rec-{str(i).zfill(4)}.dat", "wb") as f:
|
with open(f"../data/rec-{str(i).zfill(4)}.dat", "wb") as f:
|
||||||
data = b""
|
data = b""
|
||||||
|
Reference in New Issue
Block a user