Small code refactor and began using freertos tasks

This commit is contained in:
2024-08-20 18:06:07 -04:00
parent 2074fd6b73
commit 64e84ad531
4 changed files with 135 additions and 64 deletions

13
include/COMMANDS.h Normal file
View File

@@ -0,0 +1,13 @@
#pragma once
#include <cstdint>
/**
* @brief These are the serial commands that the board supports
*/
enum Commands : uint8_t{
BoardState = 0,
PING = 1,
SetStackColors = 2,
GoToIdle = 3
};

View File

@@ -0,0 +1,28 @@
/**
* @file GlobalPrint.h
* @brief a method of printing serial data to all outgoing communication methods
*/
#pragma once
#include <Arduino.h>
namespace GlobalPrint{
static void Print(const char * s){
Serial.print(s);
}
static void Print(const String &s){
GlobalPrint::Print(s.c_str());
}
static void Println(const char * s){
GlobalPrint::Print(s);
GlobalPrint::Print("\n");
}
static void Println(const String &s){
GlobalPrint::Println(s.c_str());
}
}

View File

@@ -1,35 +1,34 @@
// Other peoples libraries // Other peoples libraries
#include <Arduino.h> #include <Arduino.h>
#include <BluetoothSerial.h> #include <BluetoothSerial.h>
#include <FreeRTOS.h>
// Static Defines
#include "PINOUT.h"
#include "BOARD-DEFINITIONS.h"
#include "COMMANDS.h"
// project specific libraries // project specific libraries
#include "BluetoothSerial.h" #include "BluetoothSerial.h"
#include "SerialMessage.h" #include "SerialMessage.h"
#include "BoardLayout.h" #include "BoardLayout.h"
#include "BOARD-DEFINITIONS.h"
#include "Color.h" #include "Color.h"
#include "ColorManager.h" #include "ColorManager.h"
#include "GlobalPrint.h"
// --------------------------------------------------
// ----------------- Types ----------------------
// --------------------------------------------------
enum Commands : uint8_t{
BoardState = 0,
PING = 1,
SetStackColors = 2,
GoToIdle = 3
};
// -------------------------------------------------- // --------------------------------------------------
// ----------------- VARIABLES ---------------------- // ----------------- VARIABLES ----------------------
// -------------------------------------------------- // --------------------------------------------------
TaskHandle_t updateCommunicaitonTask;
TaskHandle_t updateBoardTask;
uint32_t boardStateTimer{0}; uint32_t boardStateTimer{0};
bool boardStateHasChanged{false}; bool boardStateHasChanged{false};
uint32_t boardStateMaxUpdatePeriod{34}; // this is a little slower than 30fps uint32_t boardStateMaxUpdatePeriod{34}; // this is a little slower than 30fps
// BluetoothSerial SerialBT; // BluetoothSerial SerialBT;
// BluetoothSerialMessage serialMessageBT(&SerialBT); // BluetoothSerialMessage serialMessageBT(&SerialBT);
SerialMessage<500> serialMessage(&Serial); SerialMessage<500, 10> serialMessage(&Serial);
BoardLayout board(BOARD_WIDTH, BOARD_LENGTH, BOARD_HEIGHT, stacks); BoardLayout board(BOARD_WIDTH, BOARD_LENGTH, BOARD_HEIGHT, stacks);
// Temporary thing until we can get bluetooth color management working on the quest // Temporary thing until we can get bluetooth color management working on the quest
@@ -38,6 +37,11 @@ ColorManager colorManager(&board);
// -------------------------------------------------- // --------------------------------------------------
// ----------------- FUNCTIONS ---------------------- // ----------------- FUNCTIONS ----------------------
// -------------------------------------------------- // --------------------------------------------------
/**
* @brief Send programming commands to the serial to bluetooth adapter so
* it is set up as expected for the VR headset
* @post the serial baud rate will be set to 9600
*/
void SetupBluetoothModule(){ void SetupBluetoothModule(){
Serial.begin(38400); Serial.begin(38400);
Serial.print("AT+UART=9600,0,0\r\n"); // set baud rate to 9600 Serial.print("AT+UART=9600,0,0\r\n"); // set baud rate to 9600
@@ -52,37 +56,33 @@ void SetupBluetoothModule(){
Serial.print("AT+ROLE=0\r\n"); // set to slave Serial.print("AT+ROLE=0\r\n"); // set to slave
delay(100); delay(100);
// exit at mode and go into pairing mode // exit at mode and go into pairing mode
Serial.print("AT+INIT\r\n"); Serial.print("AT+INIT\r\n");
Serial.begin(9600); Serial.begin(9600);
delay(100); delay(100);
} }
void printBoardState(){ void printBoardState(){
// create a buffer to hold the board state // create a buffer to hold the board state
uint16_t boardState[BOARD_WIDTH * BOARD_LENGTH]; uint16_t boardState[BOARD_WIDTH * BOARD_LENGTH];
// read in the board state // read in the board state
board.GetBoardState(boardState); board.GetBoardState(boardState);
Serial.print("!0,"); GlobalPrint::Print("!0,");
// SerialBT.print("!0,");
for(int i = 0; i < (BOARD_WIDTH * BOARD_LENGTH); i++){ for(int i = 0; i < (BOARD_WIDTH * BOARD_LENGTH); i++){
Serial.print(boardState[i]); GlobalPrint::Print(String(boardState[i]));
// SerialBT.print(boardState[i]);
if(i == (BOARD_WIDTH * BOARD_LENGTH) - 1){ if(i == (BOARD_WIDTH * BOARD_LENGTH) - 1){
break; break;
} }
Serial.print(","); GlobalPrint::Print(",");
// SerialBT.print(",");
} }
Serial.println(";"); GlobalPrint::Println(";");
// SerialBT.println(";");
} }
void setStackColor(uint32_t * args, int argsLength){ void SetStackColor(uint32_t * args, int argsLength){
uint32_t stackNum = args[1]; uint32_t stackNum = args[1];
uint32_t numColors = (argsLength - 2) / 3; uint32_t numColors = (argsLength - 2) / 3;
Color colors[numColors]; Color colors[numColors];
@@ -95,60 +95,62 @@ void setStackColor(uint32_t * args, int argsLength){
} }
board.SetStackColors(stackNum, colors); board.SetStackColors(stackNum, colors);
} }
void parseData(uint32_t * args, int argsLength){ void parseData(Message<500, 10> &message){
int32_t * args{message.GetArgs()};
uint32_t argsLength{message.GetArgsLength()};
uint32_t command = args[0]; uint32_t command = args[0];
switch(command){ switch(command){
case Commands::BoardState: case Commands::BoardState:
printBoardState(); printBoardState();
break; break;
case Commands::PING: case Commands::PING:
Serial.print("!"); GlobalPrint::Println("!" + String(Commands::PING) + ";");
// SerialBT.print("!");
Serial.print(Commands::PING);
// SerialBT.print(Commands::PING);
Serial.println(";");
// SerialBT.println(";");
break; break;
case Commands::SetStackColors: case Commands::SetStackColors:
Serial.println("!2;"); GlobalPrint::Println("!2;");
// SerialBT.println("!2;");
colorManager.Enable(false); colorManager.Enable(false);
setStackColor(args, argsLength); SetStackColor(reinterpret_cast<uint32_t *>(args), argsLength);
break; break;
case Commands::GoToIdle: case Commands::GoToIdle:
Serial.println("!3;"); GlobalPrint::Println("!3;");
// SerialBT.println("!3;");
colorManager.Enable(true); colorManager.Enable(true);
break; break;
default: default:
Serial.println("INVALID COMMAND"); GlobalPrint::Println("INVALID COMMAND");
// SerialBT.println("INVALID COMMAND");
break; break;
} }
// now that we have run the command we can clear the data for the next command.
serialMessage.ClearNewData();
} }
// -------------------------------------------------- // --------------------------------------------------
// ----------------- SETUP AND LOOP ----------------- // ----------------- FREERTOS TASKS -----------------
// -------------------------------------------------- // --------------------------------------------------
void UpdateCommunication(void * params){
void setup() { Serial.println("Spawning UpdateCommunication task");
delay(1000); for(;;){
SetupBluetoothModule(); // DO serial processing
Serial.begin(9600); serialMessage.Update();
// SerialBT.begin("blockPartyBT"); if(serialMessage.IsNewData()){
Color colors[] = {Color(255, 0, 0), Color(0, 0, 0), Color(0, 0, 0)}; parseData(serialMessage);
board.SetStackColors(2, colors); }
// serialMessageBT.Update();
boardStateTimer = millis(); // if(serialMessageBT.IsNewData()){
// parseData(serialMessageBT.GetArgs(), serialMessageBT.GetArgsLength());
// serialMessageBT.ClearNewData();
// }
vTaskDelay(3);
}
Serial.println("UpdateCommunication task has ended unexpectedly!");
} }
void UpdateBoard(void * params){
void loop() { Serial.println("Spawning UpdateBoard task");
for(;;){
if(board.BoardStateHasChanged()){ if(board.BoardStateHasChanged()){
boardStateHasChanged = true; boardStateHasChanged = true;
} }
@@ -159,16 +161,44 @@ void loop() {
boardStateHasChanged = false; boardStateHasChanged = false;
} }
// DO serial processing
serialMessage.Update();
if(serialMessage.IsNewData()){
parseData(serialMessage.GetArgs(), serialMessage.GetArgsLength());
serialMessage.ClearNewData();
}
// serialMessageBT.Update();
// if(serialMessageBT.IsNewData()){
// parseData(serialMessageBT.GetArgs(), serialMessageBT.GetArgsLength());
// serialMessageBT.ClearNewData();
// }
colorManager.Update(); colorManager.Update();
vTaskDelay(5);
}
Serial.println("UpdateBoard task has ended unexpectedly!");
}
// --------------------------------------------------
// ----------------- SETUP AND LOOP -----------------
// --------------------------------------------------
void setup() {
// delay a little bit to get the serial monitor a chance to capture the next log messages.
delay(1000);
Serial.begin(9600);
Serial.println("Beginning Setup");
Serial.println("Configuring Bluetooth Adapter");
SetupBluetoothModule();
Serial.begin(9600);
Serial.println("Configuring communication methods");
serialMessage.Init(9600);
// SerialBT.begin("blockPartyBT");
xTaskCreate(UpdateCommunication, "UpdateCommunication", 10000, NULL, 0, &updateCommunicaitonTask);
Serial.println("Beginning Board Initializaiton");
xTaskCreate(UpdateBoard, "UpdateBoard", 10000, NULL, 0, &updateBoardTask);
Color colors[] = {Color(255, 0, 0), Color(0, 0, 0), Color(0, 0, 0)};
board.SetStackColors(2, colors);
boardStateTimer = millis();
Serial.println("Setup Complete");
}
void loop() {
// delete the loop task because we don't use it
vTaskDelete(NULL);
} }