55
66#include " SystemManager.hpp"
77
8+ #include < iostream>
9+
10+ #include " FreeRTOS.h"
11+ #include " GroundStationCommunication.hpp"
12+ #include " TelemetryManager.hpp"
13+ #include " cmsis_os.h"
814#include " drivers_config.hpp"
915#include " independent_watchdog.h"
1016#include " rcreceiver_datatypes.h"
1117#include " sbus_defines.h"
1218#include " sbus_receiver.hpp"
1319#include " tim.h"
14- #include " GroundStationCommunication.hpp"
15- #include " TelemetryManager.hpp"
16- #include " GroundStationCommunication.hpp"
17- #include " TelemetryManager.hpp"
1820
19- #define TIMEOUT_CYCLES 250000 // 25k = 1 sec fro testing 10/14/2023 => 250k = 10 sec
20- #define TIMOUT_MS 10000 // 10 sec
21+ extern " C" {
22+ #include " app_fatfs.h"
23+ #include " log_util.h"
24+ }
25+
26+ #define TIMEOUT_CYCLES 250000 // 25k = 1 sec fro testing 10/14/2023 => 250k = 10 sec
27+ #define TIMOUT_MS 10000 // 10 sec
28+
29+ // 0 - AM, 1 - TM, 2 - PM
30+ static TaskHandle_t taskHandles[3 ];
2131
2232static uint32_t DisconnectionCount = 0 ;
2333float prevthrottle;
@@ -52,6 +62,7 @@ TelemetryManager* SystemManager::setupTM() {
5262 TMStateData stateData;
5363
5464 // values to be assigned to stateData
65+ // THIS IS JUST A PLACEHOLDER, THE MEMORY ADDRESSES NEED TO LIVE LONGER THAN THE SM CONSTRUCTOR
5566 int32_t alt = 0 ;
5667 int32_t lat = 0 ;
5768 int32_t lon = 0 ;
@@ -69,48 +80,71 @@ TelemetryManager* SystemManager::setupTM() {
6980 float yawspeed = 0 ;
7081
7182 // use the memory address of the above, since stateData uses pointers
72- stateData.alt = &alt;
73- stateData.lat = ⪫
74- stateData.lon = &lon;
75- stateData.relative_alt = &relative_alt;
76- stateData.vx = &vx;
77- stateData.vy = &vy;
78- stateData.vz = &vz;
79- stateData.hdg = &hdg;
80- stateData.time_boot_ms = &time_boot_ms;
81- stateData.roll = &roll;
82- stateData.pitch = &pitch;
83- stateData.yaw = &yaw;
84- stateData.rollspeed = &rollspeed;
85- stateData.pitchspeed = &pitchspeed;
86- stateData.yawspeed = &yawspeed;
83+ stateData.set_alt ( &alt) ;
84+ stateData.set_lat ( &lat) ;
85+ stateData.set_lon ( &lon) ;
86+ stateData.set_relative_alt ( &relative_alt) ;
87+ stateData.set_vx ( &vx) ;
88+ stateData.set_vy ( &vy) ;
89+ stateData.set_vz ( &vz) ;
90+ stateData.set_hdg ( &hdg) ;
91+ stateData.set_time_boot_ms ( &time_boot_ms) ;
92+ stateData.set_roll ( &roll) ;
93+ stateData.set_pitch ( &pitch) ;
94+ stateData.set_yaw ( &yaw) ;
95+ stateData.set_rollspeed ( &rollspeed) ;
96+ stateData.set_pitchspeed ( &pitchspeed) ;
97+ stateData.set_yawspeed ( &yawspeed) ;
8798
8899 MAV_STATE mavState = MAV_STATE::MAV_STATE_STANDBY;
89100 MAV_MODE_FLAG mavMode = MAV_MODE_FLAG::MAV_MODE_FLAG_MANUAL_INPUT_ENABLED;
90101
91- // Creating parameters for the GroundStationCommunication that will be passed to telemetryManager
102+ // Creating parameters for the GroundStationCommunication that will be passed to
103+ // telemetryManager
92104 TMCircularBuffer DMAReceiveBuffer = *(new TMCircularBuffer (rfd900_circular_buffer));
93105
94-
95106 // the buffer that stores non_routine/low_priority bytes (ex. Battery Voltage) to be sent to the
96107 // ground station.
97- uint8_t * lowPriorityTransmitBuffer = new uint8_t [RFD900_BUF_SIZE];
108+ uint8_t * lowPriorityTransmitBuffer = new uint8_t [RFD900_BUF_SIZE];
98109
99110 // the buffer that stores routine/high_priority bytes (ex. heading, general state data) to be
100111 // sent to the ground station.
101- uint8_t * highPriorityTransmitBuffer = new uint8_t [RFD900_BUF_SIZE];
112+ uint8_t * highPriorityTransmitBuffer = new uint8_t [RFD900_BUF_SIZE];
102113
103- GroundStationCommunication GSC = *(new GroundStationCommunication (DMAReceiveBuffer, lowPriorityTransmitBuffer,
104- highPriorityTransmitBuffer, RFD900_BUF_SIZE));
114+ GroundStationCommunication GSC = *(new GroundStationCommunication (
115+ DMAReceiveBuffer, lowPriorityTransmitBuffer, highPriorityTransmitBuffer, RFD900_BUF_SIZE));
105116
106- // the buffer that stores the bytes received from the ground station.
117+ // the buffer that stores the bytes received from the ground station.
107118 MavlinkTranslator MT;
108119
109120 return new TelemetryManager (stateData, mavState, mavMode, GSC, MT);
110121}
111122
112- void SystemManager::flyManually () {
123+ // wrapper functions are needed as FreeRTOS xTaskCreate function does not accept functions that have
124+ // "this" pointers
125+ void SystemManager::attitudeManagerTaskWrapper (void *pvParameters) {
126+ SystemManager *systemManagerInstance = static_cast <SystemManager *>(pvParameters);
127+ systemManagerInstance->attitudeManagerTask ();
128+ }
129+
130+ void SystemManager::telemetryManagerTaskWrapper (void *pvParameters) {
131+ SystemManager *systemManagerInstance = static_cast <SystemManager *>(pvParameters);
132+ systemManagerInstance->telemetryManagerTask ();
133+ }
134+
135+ void SystemManager::pathManagerTaskWrapper (void *pvParameters) {
136+ SystemManager *systemManagerInstance = static_cast <SystemManager *>(pvParameters);
137+ systemManagerInstance->pathManagerTask ();
138+ }
139+
140+ void SystemManager::systemManagerTask () {
141+ TickType_t xNextWakeTime = xTaskGetTickCount ();
142+ uint16_t frequency = 5 ;
143+
113144 for (;;) {
145+ printf (" SM called\r\n " );
146+ HAL_GPIO_TogglePin (GPIOB, GPIO_PIN_7); // toggle led light for testing
147+
114148 this ->rcInputs_ = rcController_->GetRCControl ();
115149
116150 // TO-DO: need to implement it using is_Data_New;
@@ -150,5 +184,68 @@ void SystemManager::flyManually() {
150184 this ->pitchMotorChannel_ .set (SBUS_MAX / 2 );
151185 this ->invertedRollMotorChannel_ .set (SBUS_MAX / 2 );
152186 }
187+
188+ vTaskDelayUntil (&xNextWakeTime, 1000 / frequency);
189+ }
190+ }
191+
192+ void SystemManager::attitudeManagerTask () {
193+ TickType_t xNextWakeTime = xTaskGetTickCount ();
194+ uint16_t frequency = 5 ;
195+
196+ for (;;) {
197+ // call AM
198+
199+ printf (" AM called\r\n " );
200+ HAL_GPIO_TogglePin (GPIOC, GPIO_PIN_7); // toggle led light for testing
201+ vTaskDelayUntil (&xNextWakeTime, 1000 / frequency);
202+ }
203+ }
204+
205+ void SystemManager::telemetryManagerTask () {
206+ TickType_t xNextWakeTime = xTaskGetTickCount ();
207+ uint16_t frequency = 5 ;
208+
209+ for (;;) {
210+ // call TM
211+
212+ printf (" TM called\r\n " );
213+ HAL_GPIO_TogglePin (GPIOA, GPIO_PIN_9); // toggle led light for testing
214+ vTaskDelayUntil (&xNextWakeTime, 1000 / frequency);
215+ }
216+ }
217+
218+ void SystemManager::pathManagerTask () {
219+ TickType_t xNextWakeTime = xTaskGetTickCount ();
220+ uint16_t frequency = 5 ;
221+
222+ for (;;) {
223+ // call PM
224+
225+ printf (" PM called\r\n " );
226+ vTaskDelayUntil (&xNextWakeTime, 1000 / frequency);
227+ }
228+ }
229+
230+ void SystemManager::startSystemManager () {
231+ printf (" Initializing Tasks\r\n " );
232+
233+ // enabling SD card logging
234+ if (MX_FATFS_Init () != APP_OK) {
235+ Error_Handler ();
153236 }
237+ logInit ();
238+
239+ // BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName,
240+ // configSTACK_DEPTH_TYPE usStackDepth, void * pvParameters, UBaseType_t uxPriority,
241+ // TaskHandle_t * pxCreatedTask );
242+ // function's name description size of
243+ // stack to allocate parameters for task priority
244+ // handler
245+ xTaskCreate (attitudeManagerTaskWrapper, " AM TASK" , 800U , this , osPriorityNormal, taskHandles);
246+ xTaskCreate (telemetryManagerTaskWrapper, " TM TASK" , 800U , this , osPriorityNormal,
247+ taskHandles + 1 );
248+ // xTaskCreate(pathManagerTaskWrapper, "PM TASK", 800U, this, osPriorityNormal, taskHandles +2);
249+
250+ systemManagerTask ();
154251}
0 commit comments