Serial Communication Framework

This commit is contained in:
Kinchin Fong 2023-09-09 22:34:57 +08:00
parent d75f1d6f94
commit eb131bd020
7 changed files with 125 additions and 13 deletions

View File

@ -1,8 +1,8 @@
#include "ConfigManager.h"
void ConfigManager::Init(VFileSystem* fs)
int ConfigManager::Init(VFileSystem* fs)
{
return 0;
}
int ConfigManager::ReadId(char* id)

View File

@ -13,7 +13,7 @@ struct DeviceConfig
class ConfigManager
{
public:
void Init(VFileSystem* fs);
int Init(VFileSystem* fs);
int ReadId(char* id);
int SetId(char* id);
int ReadConfig(DeviceConfig& config);

View 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");
}
}

View 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;
};

View File

@ -16,3 +16,4 @@ board_upload.flash_size = 16MB
board_build.partitions = partitions_12M_SPIFFS.csv
framework = arduino
upload_port = COM8
lib_deps = locoduino/RingBuffer@^1.0.4

View File

@ -4,31 +4,29 @@
#include "VFileSystem.h"
#include "ConfigManager.h"
#include "DataRecorder.h"
#include "InterSerial.h"
VFileSystem fs;
ConfigManager cfg;
DataRecorder dataRec;
InterSerial interSerial;
void setup()
{
Serial1.begin(115200);
Serial1.println("Begin...");
if (fs.Init()) {
Serial1.println("FS Init Failed.");
return;
}
cfg.Init(&fs);
if (cfg.Init(&fs)) {
return;
}
if (dataRec.Init(&fs)) {
Serial1.println("DataRecorder Init Failed.");
return;
}
Serial1.println("End.");
interSerial.Init(&dataRec, &cfg);
}
void loop()
{
interSerial.Process();
delay(10);
}

View File

@ -1,3 +1,8 @@
import os
if not os.path.exists('../data'):
os.makedirs('../data')
for i in range(1024):
with open(f"../data/rec-{str(i).zfill(4)}.dat", "wb") as f:
data = b""