116 lines
3.7 KiB
C++
116 lines
3.7 KiB
C++
#pragma once
|
|
#include <Arduino.h>
|
|
|
|
/**
|
|
* @file serialConnector.h
|
|
* @author Lyubomir Penev (me@lpenev.com)
|
|
* @brief This file contains all the code to send and receive data over the the Arduino's serial port while ensuring complete data integrity
|
|
* @version 1
|
|
* @date 2026-01-25
|
|
*
|
|
* @copyright Copyright (c) 2026
|
|
*
|
|
*/
|
|
|
|
class SerialConnector
|
|
{
|
|
|
|
private:
|
|
String previouSent;
|
|
String received;
|
|
String command;
|
|
|
|
// Callback handlers for specific commands
|
|
void (*calibrationBeginHandler)(String args);
|
|
void (*calibrationInteruptHandler)(String args);
|
|
|
|
/**
|
|
* Convert a string into its hexadecimal representation.
|
|
* @param cmd Input string to convert.
|
|
* @return Hexadecimal representation of the input string.
|
|
*/
|
|
String stringToHex(String cmd);
|
|
|
|
/**
|
|
* Convert a string into a numeric checksum used by the protocol.
|
|
* @param cmd Input string to convert.
|
|
* @return Integer checksum computed from the input string.
|
|
*/
|
|
int stringToCheckNum(String cmd);
|
|
|
|
/**
|
|
* Find the index of a character inside a string.
|
|
* @param ch Character to search for.
|
|
* @param str String to search within.
|
|
* @return Index of the character if found, -1 otherwise.
|
|
*/
|
|
int getCharIndex(char ch, String str);
|
|
|
|
/**
|
|
* Extract the command portion from an incoming raw message.
|
|
* The message format is expected to be: CMD#ARGS#CHECK@ (terminator '@').
|
|
* @param incomming Raw incoming message string.
|
|
* @return The command portion of the incoming message.
|
|
*/
|
|
String getCommandFromIncomming(String incomming);
|
|
|
|
/**
|
|
* Extract the arguments portion from an incoming raw message.
|
|
* @param incomming Raw incoming message string.
|
|
* @return The arguments portion of the incoming message.
|
|
*/
|
|
String getArgsFromIncomming(String incomming);
|
|
|
|
/**
|
|
* Extract the check bit (checksum) portion from an incoming raw message.
|
|
* @param incomming Raw incoming message string.
|
|
* @return The check bit (as string) of the incoming message.
|
|
*/
|
|
String getCheckBitFromIncomming(String incomming);
|
|
|
|
/**
|
|
* Verify that the provided checkBit matches the computed checksum for cmd and args.
|
|
* @param cmd Command portion.
|
|
* @param args Arguments portion.
|
|
* @param checkBit Integer check bit to verify against.
|
|
* @return true if checksum matches, false otherwise.
|
|
*/
|
|
bool verifyCheckBit(String cmd, String args, int checkBit);
|
|
|
|
/**
|
|
* Send a repeat request to the other side.
|
|
* This will send the protocol message that instructs the peer to re-send.
|
|
*/
|
|
void repeat();
|
|
|
|
/**
|
|
* Send an acknowledgement for a received message.
|
|
* @param checkBit Check bit value to include in the acknowledgement.
|
|
*/
|
|
void acknowledge(int checkBit);
|
|
|
|
/**
|
|
* After sending a command, read for the peer's reply (ACKG or RPT) and act accordingly.
|
|
* @param cmd The full command string that was sent (including checksum and terminator).
|
|
*/
|
|
void afterSendCheck(String cmd);
|
|
|
|
public:
|
|
/**
|
|
* Periodically called to process incoming serial data and dispatch events.
|
|
* Should be called frequently from the main loop.
|
|
*/
|
|
void cycle();
|
|
|
|
// Register a callbacks for specific commands.
|
|
void onCalibrationBegin(void (*handler)(String args));
|
|
void onCalibrationInterupt(void (*handler)(String args));
|
|
|
|
/**
|
|
* Send a command using the defined protocol. The function composes the message,
|
|
* computes the checksum and sends the final string terminated with '@'.
|
|
* @param cmd Command name (e.g., "READ").
|
|
* @param args Arguments for the command.
|
|
*/
|
|
void sendCommand(String cmd, String args);
|
|
}; |