Skip to content
This repository was archived by the owner on Jun 28, 2025. It is now read-only.

Commit d728939

Browse files
committed
Merge branch 'Dependency-Injection' of github.com:UWARG/efs-zeropilot-3.5 into Dependency-Injection
2 parents 3a76a7a + 56825cc commit d728939

File tree

8 files changed

+262
-111
lines changed

8 files changed

+262
-111
lines changed

Boardfiles/nucleol552zeq/Core/Inc/FreeRTOSConfig.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
#define configTICK_RATE_HZ ((TickType_t)1000)
7373
#define configMAX_PRIORITIES ( 56 )
7474
#define configMINIMAL_STACK_SIZE ((uint16_t)128)
75-
#define configTOTAL_HEAP_SIZE ((size_t)8192)
75+
#define configTOTAL_HEAP_SIZE ((size_t)65536)
7676
#define configMAX_TASK_NAME_LEN ( 16 )
7777
#define configUSE_TRACE_FACILITY 1
7878
#define configUSE_16_BIT_TICKS 0

Boardfiles/nucleol552zeq/Core/Src/main.cpp

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,14 @@
3232
#include "ucpd.h"
3333
#include "usb.h"
3434
#include "gpio.h"
35+
#include "SystemManager.hpp"
3536

3637
/* Private includes ----------------------------------------------------------*/
3738
/* USER CODE BEGIN Includes */
3839
#include "SystemManager.hpp"
3940
#include "drivers_config.hpp"
4041
#include "independent_watchdog.h"
4142

42-
extern "C" {
43-
#include "app_fatfs.h"
44-
#include "log_util.h"
45-
}
4643
/* USER CODE END Includes */
4744

4845
/* Private typedef -----------------------------------------------------------*/
@@ -77,9 +74,9 @@ extern "C" {
7774

7875
/* Private user code ---------------------------------------------------------*/
7976
/* USER CODE BEGIN 0 */
80-
void SMTask(void *pvParameters) {
81-
SystemManager SM;
82-
SM.flyManually();
77+
void SMTask(void * pvParameters){
78+
SystemManager SM;
79+
SM.startSystemManager();
8380
}
8481
/* USER CODE END 0 */
8582

@@ -131,23 +128,12 @@ int main(void)
131128
MX_ICACHE_Init();
132129
MX_TIM3_Init();
133130
MX_SDMMC1_SD_Init();
134-
if (MX_FATFS_Init() != APP_OK) {
135-
Error_Handler();
136-
}
137131
/* USER CODE BEGIN 2 */
138-
logInit();
139-
140-
TaskHandle_t hSM = NULL;
141-
xTaskCreate(SMTask, "SM", 500U, NULL, osPriorityNormal, &hSM);
142132

143133
/* USER CODE END 2 */
144134

145-
/* Init scheduler */
146-
osKernelInitialize(); /* Call init function for freertos objects (in freertos.c) */
147-
MX_FREERTOS_Init();
148-
149-
/* Start scheduler */
150-
osKernelStart();
135+
xTaskCreate(SMTask, "SM Task", 1500U, NULL, osPriorityNormal, NULL);
136+
vTaskStartScheduler();
151137
/* We should never get here as control is now taken by the scheduler */
152138
/* Infinite loop */
153139
/* USER CODE BEGIN WHILE */

Boardfiles/nucleol552zeq/Core/Src/usart.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121
#include "usart.h"
2222

2323
/* USER CODE BEGIN 0 */
24-
24+
int __io_putchar(int ch)
25+
{
26+
HAL_UART_Transmit(&hlpuart1, (uint8_t *)&ch, 1, 100);
27+
return ch;
28+
}
2529
/* USER CODE END 0 */
2630

2731
UART_HandleTypeDef hlpuart1;
@@ -44,7 +48,7 @@ void MX_LPUART1_UART_Init(void)
4448

4549
/* USER CODE END LPUART1_Init 1 */
4650
hlpuart1.Instance = LPUART1;
47-
hlpuart1.Init.BaudRate = 209700;
51+
hlpuart1.Init.BaudRate = 112500;
4852
hlpuart1.Init.WordLength = UART_WORDLENGTH_8B;
4953
hlpuart1.Init.StopBits = UART_STOPBITS_1;
5054
hlpuart1.Init.Parity = UART_PARITY_NONE;

Boardfiles/nucleol552zeq/nucleol552zeq.ioc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ IWDG.IPParameters=Prescaler,Reload
100100
IWDG.Prescaler=IWDG_PRESCALER_8
101101
IWDG.Reload=3999
102102
KeepUserPlacement=false
103-
LPUART1.BaudRate=230400
103+
LPUART1.BaudRate=112500
104104
LPUART1.IPParameters=BaudRate
105105
Mcu.CPN=STM32L552ZET6Q
106106
Mcu.ContextProject=TrustZoneDisabled

SystemManager/Inc/SystemManager.hpp

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,28 +16,36 @@
1616
#define SBUS_MAX 100
1717

1818
class SystemManager {
19-
public:
20-
/* Constructors and Destructors */
21-
SystemManager();
22-
~SystemManager();
23-
24-
/* Other managers*/
25-
TelemetryManager *telemetryManager;
26-
27-
/* Class Functions */
28-
void flyManually();
29-
TelemetryManager* setupTM();
30-
31-
private:
32-
SBUSReceiver* rcController_;
33-
RCControl rcInputs_;
34-
PWMChannel throttleMotorChannel_;
35-
PWMChannel yawMotorChannel_;
36-
PWMChannel rollMotorChannel_;
37-
PWMChannel invertedRollMotorChannel_;
38-
PWMChannel pitchMotorChannel_;
39-
IndependentWatchdog watchdog_;
19+
public:
20+
/* Constructors and Destructors */
21+
SystemManager();
22+
23+
/* Other managers*/
24+
TelemetryManager *telemetryManager;
25+
26+
TelemetryManager* setupTM();
27+
28+
/* Class Functions */
29+
void startSystemManager();
30+
31+
private:
32+
SBUSReceiver* rcController_;
33+
RCControl rcInputs_;
34+
PWMChannel throttleMotorChannel_;
35+
PWMChannel yawMotorChannel_;
36+
PWMChannel rollMotorChannel_;
37+
PWMChannel invertedRollMotorChannel_;
38+
PWMChannel pitchMotorChannel_;
39+
IndependentWatchdog watchdog_;
40+
41+
static void attitudeManagerTaskWrapper(void *pvParameters);
42+
static void telemetryManagerTaskWrapper(void *pvParameters);
43+
static void pathManagerTaskWrapper(void *pvParameters);
44+
45+
void systemManagerTask();
46+
void attitudeManagerTask();
47+
void telemetryManagerTask();
48+
void pathManagerTask();
4049
};
4150

42-
4351
#endif //ZEROPILOT_3_5_SYSTEMMANAGER_HPP

SystemManager/Src/SystemManager.cpp

Lines changed: 126 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,29 @@
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

2232
static uint32_t DisconnectionCount = 0;
2333
float 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 = &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

Comments
 (0)