Loading...
Searching...
No Matches
stateupdate.c
1/***********************************************************************************
2 * @file stateUpdate.c *
3 * @author Matt Ricci *
4 * @addtogroup RTOS *
5 * *
6 * @{ *
7 ***********************************************************************************/
8
9#include "stateupdate.h"
10#include "drivers.h"
11#include "membuff.h"
12#include "stdio.h"
13
14extern EventGroupHandle_t xTaskEnableGroup;
15extern MessageBufferHandle_t xUsbTxBuff;
16extern SemaphoreHandle_t xUsbMutex;
17
18/* =============================================================================== */
30void vStateUpdate(void *argument) {
31 const TickType_t xFrequency = pdMS_TO_TICKS(20); // 50Hz
32
33 unsigned int CANHigh = 0;
34 unsigned int CANLow = 0;
35 unsigned int id = 0;
36
37 float avgPressCurrent = 0;
38 float avgPressPrevious = 0;
39 float avgVelCurrent = 0;
40 float avgVelPrevious = 0;
41
42 Handles *handles = (Handles *)argument;
43
44 DeviceHandle_t accelHandle = DeviceHandle_getHandle("Accel");
45 KX134_1211 *accel = accelHandle.device;
46
47 MemBuff *mem = StateHandle_getHandle("Memory").state;
48 enum State *flightState = StateHandle_getHandle("FlightState").state;
49 float *tilt = StateHandle_getHandle("Tilt").state;
50 float *altitude = StateHandle_getHandle("Altitude").state;
51 float *velocity = StateHandle_getHandle("Velocity").state;
52 SlidingWindow *avgVel = StateHandle_getHandle("AvgVelBuffer").state;
53 SlidingWindow *avgPress = StateHandle_getHandle("AvgPressBuffer").state;
54
55 for (;;) {
56 // Block until 20ms interval
57 TickType_t xLastWakeTime = xTaskGetTickCount();
58 vTaskDelayUntil(&xLastWakeTime, xFrequency);
59
60 // Emergency aerobrakes for excessive tilt
61 if (*tilt >= 30.0f) {
62 // CAN payload for aerobrakes retract
63 CANHigh = 0x00000000;
64 CANLow = 0x00000000;
65 id = CAN_HEADER_AEROBRAKES_RETRACT;
66 CAN_TX(CAN_AB, 8, CANHigh, CANLow, id);
67 }
68
69 switch (*flightState) {
70 case PRELAUNCH:
71 if (accel->accelData[ZINDEX] >= ACCEL_LAUNCH) {
72#ifdef FLIGHT_TEST
73 GPIOB->ODR ^= 0x8000;
74 GPIOD->ODR ^= 0x8000;
75#endif
76#ifndef DEBUG
77 // vTaskSuspend(handles->xUsbReceiveHandle);
78 // vTaskDelete(handles->xUsbTransmitHandle);
79 // vTaskDelete(handles->xUsbReceiveHandle);
80#endif
81 xEventGroupSetBits(xTaskEnableGroup, GROUP_TASK_ENABLE_FLASH); // Enable flash
82 xEventGroupSetBits(xTaskEnableGroup, GROUP_TASK_ENABLE_HIGHRES); // Enable high resolution data acquisition
83 xEventGroupSetBits(xTaskEnableGroup, GROUP_TASK_ENABLE_LOWRES); // Enable low resolution data acquisition
84 *flightState = LAUNCH;
85 }
86 break;
87
88 case LAUNCH:
89 avgVel->calculateMovingAverage(avgVel, &avgVelCurrent);
90 // Send altitude to aerobrakes via CAN
91 CANHigh = 0x00000000;
92 memcpy(&CANLow, altitude, sizeof(float));
93 id = CAN_HEADER_AEROBRAKES_DATA;
94 CAN_TX(CAN_AB, 8, CANHigh, CANLow, id);
95 // Transition to motor burnout state on velocity decrease
96 if ((avgVelCurrent - avgVelPrevious) < 0) {
97#ifdef FLIGHT_TEST
98 GPIOB->ODR ^= 0x8000;
99 GPIOD->ODR ^= 0x8000;
100#endif
101 *flightState = COAST;
102 }
103 avgVelPrevious = avgVelCurrent;
104 break;
105
106 case COAST:
107 avgPress->calculateMovingAverage(avgPress, &avgPressCurrent);
108 // Send altitude to aerobrakes via CAN
109 CANHigh = 0x00000000;
110 memcpy(&CANLow, altitude, sizeof(float));
111 id = CAN_HEADER_AEROBRAKES_DATA;
112 CAN_TX(CAN_AB, 8, CANHigh, CANLow, id);
113 // Transition to apogee state on three way vote of altitude, velocity, and tilt
114 // apogee is determined as two of three conditions evaluating true
115 if ((((avgPressCurrent - avgPressPrevious) > 0) + (*tilt >= 90) + (*velocity < 0.0f)) >= 2) {
116#ifdef FLIGHT_TEST
117 GPIOB->ODR ^= 0x8000;
118 GPIOD->ODR ^= 0x8000;
119#endif
120 *flightState = APOGEE;
121
122 taskENTER_CRITICAL();
123 buzzer(3215 * 5);
124 taskEXIT_CRITICAL();
125
126 union U {
127 TickType_t ticks;
128 uint8_t *bytes;
129 };
130 union U u;
131 u.ticks = xTaskGetTickCount();
132
133 // Log apogee event to flash
134 mem->append(mem, HEADER_EVENT_APOGEE);
135 mem->appendBytes(mem, u.bytes, sizeof(TickType_t));
136 // Send transmission to trigger apogee E-matches
137 }
138 avgPressPrevious = avgPressCurrent;
139 break;
140
141 case APOGEE:
142 // Retract aerobrakes
143 CANHigh = 0x00000000;
144 CANLow = 0x00000000;
145 id = CAN_HEADER_AEROBRAKES_RETRACT;
146 CAN_TX(CAN_AB, 8, CANHigh, CANLow, id);
147 // Deploy drogue chute
148 GPIOD->ODR |= 0x8000;
149 // Transition to descent state when below main deployment altitude
150 if (*altitude <= MAIN_ALTITUDE_METERS) {
151#ifdef FLIGHT_TEST
152 GPIOB->ODR ^= 0x8000;
153 GPIOD->ODR ^= 0x8000;
154#endif
155 *flightState = DESCENT;
156 // Add descent event dataframe to buffer
157 }
158 break;
159
160 case DESCENT:
161 // Handle descent state actions
162 break;
163 }
164 }
165}
166
float accelData[KX134_1211_DATA_COUNT]
Processed accelerations array.
Definition kx134_1211.h:63