Small code refactor and began using freertos tasks
This commit is contained in:
13
include/COMMANDS.h
Normal file
13
include/COMMANDS.h
Normal 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
|
||||||
|
};
|
||||||
28
lib/GlobalPrint/GlobalPrint.h
Normal file
28
lib/GlobalPrint/GlobalPrint.h
Normal 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());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Submodule lib/SerialMessage updated: 7cd43742b6...a0bb93624d
156
src/main.cpp
156
src/main.cpp
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user