Add Serial library
This commit is contained in:
parent
365d8c987a
commit
30deee981b
16
include/SerialCmd.h
Normal file
16
include/SerialCmd.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef SERIALCMD_H
|
||||||
|
#define SERIALCMD_H
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
int SerialCmd_readFromSerial (void);
|
||||||
|
|
||||||
|
void SerialCmd_clearCmdArray (void);
|
||||||
|
|
||||||
|
int SerialCmd_checkCmdArrayForPrefix (void);
|
||||||
|
|
||||||
|
uint32_t SerialCmd_parseColor(int startOffset);
|
||||||
|
|
||||||
|
char SerialCmd_type(void);
|
||||||
|
|
||||||
|
#endif /* SERIALCMD_H */
|
114
src/SerialCmd.cpp
Normal file
114
src/SerialCmd.cpp
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
|
||||||
|
#include "SerialCmd.h"
|
||||||
|
#include "ColorUtil.h"
|
||||||
|
#include <Arduino.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Serial fields
|
||||||
|
#define CMD_MAX 128
|
||||||
|
|
||||||
|
static char myCmd[CMD_MAX];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* number of read bytes
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
int SerialCmd_readFromSerial (void)
|
||||||
|
{
|
||||||
|
//read from the serial buffer and flush
|
||||||
|
int inputSize = Serial.available();
|
||||||
|
|
||||||
|
//give serial a chance to receive all bytes
|
||||||
|
if(inputSize > 0){
|
||||||
|
delay(100);
|
||||||
|
inputSize = Serial.available();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(inputSize > 0 && inputSize < CMD_MAX)
|
||||||
|
{
|
||||||
|
Serial.print("inputSize: ");
|
||||||
|
Serial.print(inputSize);
|
||||||
|
for (int i = 0; i < inputSize; i++){
|
||||||
|
myCmd[i] = Serial.read();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(inputSize >= CMD_MAX)
|
||||||
|
{
|
||||||
|
Serial.flush();
|
||||||
|
Serial.print("too much data, flush");
|
||||||
|
}
|
||||||
|
return inputSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* clear the cmd array
|
||||||
|
*/
|
||||||
|
void SerialCmd_clearCmdArray(void)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < CMD_MAX; i++)
|
||||||
|
{
|
||||||
|
myCmd[i] = '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief
|
||||||
|
* check if command has the required prefix
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
int SerialCmd_checkCmdArrayForPrefix (void)
|
||||||
|
{
|
||||||
|
if (myCmd[0] == 'o'
|
||||||
|
&& myCmd[1] == 'l'
|
||||||
|
&& myCmd[2] == 'l'
|
||||||
|
&& myCmd[3] == 'p'
|
||||||
|
&& myCmd[4] == 'e')
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
char SerialCmd_type(void)
|
||||||
|
{
|
||||||
|
if (SerialCmd_checkCmdArrayForPrefix())
|
||||||
|
{
|
||||||
|
return myCmd[5];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return '\0';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t SerialCmd_parseColor(int startOffset)
|
||||||
|
{
|
||||||
|
unsigned int colorParts[3]; /* 0: red, 1: green, 2: blue */
|
||||||
|
unsigned int colorSum = 0;
|
||||||
|
|
||||||
|
if (startOffset > (CMD_MAX - sizeof(colorParts)))
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i=0; i < (2*3); i+= 2)
|
||||||
|
{
|
||||||
|
colorParts[i/2] = (myCmd[i+startOffset] <= '9') ? ((myCmd[i+startOffset]-'0') << 4) : (((myCmd[i+startOffset]-'A')+10) << 4);
|
||||||
|
if (colorParts[i/2] < 0)
|
||||||
|
{
|
||||||
|
Serial.print("calcErr:");
|
||||||
|
Serial.println(colorParts[i/2]);
|
||||||
|
}
|
||||||
|
colorParts[i/2] += ( (myCmd[i+startOffset+1] <= '9') ? (myCmd[i+startOffset+1]-'0') : (((myCmd[i+startOffset+1]-'A')+10)) );
|
||||||
|
}
|
||||||
|
int r = colorParts[0]; /* fill red */
|
||||||
|
int g = colorParts[1]; /* fill green */
|
||||||
|
int b = colorParts[2]; /* fill blue */
|
||||||
|
|
||||||
|
return Color(r, g, b);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user