-
Notifications
You must be signed in to change notification settings - Fork 0
/
bupdatastorage.c
189 lines (167 loc) · 10.3 KB
/
bupdatastorage.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include "bupdatastorage.h"
#include "heightmap/heightmap.platformdepend.h"
#include "heightmap/heightmap.h"
#include "selftesting.h"
#include "config.h"
#include "radiostation.h"
#ifdef LOGS_ENABLE
#include "logger/logger.h"
#endif
/*******************************************************************************************************************
Версия ПО БУП
*******************************************************************************************************************/
const BupFirmwareVersion bupFirmwareVersion = {FIRMWARE_VERSION_MAJOR,
FIRMWARE_VERSION_MINOR,
FIRMWARE_VERSION_MICRO,
MATH_VERSION_MAJOR,
MATH_VERSION_MINOR};
/*******************************************
Cлужебные данные БУП
*******************************************/
BupDataStorage bupDataStorage;
/***************************************************************************
Функции доступа к данным БУП
***************************************************************************/
double Bup_getTouchdownPointLatitude(void) { return bupDataStorage.touchdownPointLatitude;}
double Bup_getTouchdownPointLongitude(void) { return bupDataStorage.touchdownPointLongitude;}
double Bup_getTouchdownPointAltitude(void) { return bupDataStorage.touchdownPointAltitude;}
short Bup_getTouchdownPointRelief(void) { return bupDataStorage.touchdownPointRelief;}
double Bup_getRadioPointLatitude(void) { return bupDataStorage.radioPointLatitude; }
double Bup_getRadioPointLongitude(void) { return bupDataStorage.radioPointLongitude; }
uint8_t Bup_getRadioPointUpdateIndex(void) { return bupDataStorage.radioPointUpdateIndex; }
short Bup_getRadioPointRelief(void) { return bupDataStorage.radioPointRelief; }
double Bup_getCurrentPointLatitude(void) { return bupDataStorage.currentPointLatitude;}
double Bup_getCurrentPointLongitude(void) { return bupDataStorage.currentPointLongitude;}
double Bup_getCurrentPointAltitude(void) { return bupDataStorage.currentPointAltitude;}
short Bup_getCurrentPointRelief(void) { return bupDataStorage.currentPointRelief;}
double Bup_getCurrentHeadingTrue(void) { return bupDataStorage.currentHeadingTrue;}
double Bup_getCurrentHeadingMgn(void) { return bupDataStorage.currentHeadingMgn;}
double Bup_getCurrentVelocityLatitude(void) { return bupDataStorage.currentVelocityLatitude;}
double Bup_getCurrentVelocityLongitude(void){ return bupDataStorage.currentVelocityLongitude;}
double Bup_getCurrentVelocityAltitude(void) { return bupDataStorage.currentVelocityAltitude;}
double Bup_getCurrentPitch(void) { return bupDataStorage.currentPitch;}
double Bup_getCurrentRoll(void) { return bupDataStorage.currentRoll;}
double Bup_getCurrentCourse(void) { return bupDataStorage.currentCourse;}
float Bup_getBatteryVoltage(void) { return bupDataStorage.battery50V; }
uint32_t Bup_getControlTime (void) { return bupDataStorage.controlSecond;}
/**************************************************************************************************************
Bup_initialize - Инициализация хранилища данных
***************************************************************************************************************/
void Bup_initialize (void)
{
/* Данные о запланированной точке приземления */
Bup_loadTouchdownPoint();
/* Данные точки, получаемой с радиостанции */
bupDataStorage.radioPointLatitude = 0;
bupDataStorage.radioPointLongitude = 0;
bupDataStorage.radioPointUpdateIndex = 0;
bupDataStorage.radioPointRelief = 0;
/* Текущие данные местоположения */
bupDataStorage.currentPointLatitude = 0;
bupDataStorage.currentPointLongitude = 0;
bupDataStorage.currentPointAltitude = 0;
bupDataStorage.currentPointRelief = 0x7FFF;
/* Текущие данные с датчиков */
bupDataStorage.currentHeadingTrue = 0;
bupDataStorage.currentHeadingMgn = 0;
bupDataStorage.currentVelocityLatitude = 0;
bupDataStorage.currentVelocityLongitude = 0;
bupDataStorage.currentVelocityAltitude = 0;
bupDataStorage.currentPitch = 0;
bupDataStorage.currentRoll = 0;
bupDataStorage.currentCourse = 0;
/* Прочие системные данные */
bupDataStorage.controlSecond = 0;
bupDataStorage.battery50V = 0;
}
/**************************************************************************************************************
Bup_updateData - Обновление данных хранилища
***************************************************************************************************************/
void Bup_updateData (void)
{
// Просим данные у СНС
Bup_updateDataFromSNS ();
// Просим данные у СВС
Bup_updateDataFromSWS ();
// Обновить данные радиостанции
Bup_updateRadiostationData ();
// Далее конвертируем полученные данные и будем хранить их уже в таком виде
bupDataStorage.currentPointLatitude = SNS_getLatitude();
bupDataStorage.currentPointLongitude = SNS_getLongitude();
bupDataStorage.currentPointAltitude = SNS_getAltitude();
bupDataStorage.currentHeadingTrue = SNS_getTrueCourse();
bupDataStorage.currentHeadingMgn = SNS_getMagnetCourse();
bupDataStorage.currentVelocityLatitude = SNS_getLatitudeVelocity();
bupDataStorage.currentVelocityLongitude = SNS_getLongitudeVelocity();
bupDataStorage.currentVelocityAltitude = SNS_getAltitudeVelocity();
bupDataStorage.currentPitch = SNS_getPitch();
bupDataStorage.currentRoll = SNS_getRoll();
bupDataStorage.currentCourse = SNS_getGroundTrack();
// Рассчитываем по полученным данным высоту рельефа в точке
bupDataStorage.currentPointRelief = getHeightOnThisPoint(bupDataStorage.currentPointLongitude,
bupDataStorage.currentPointLatitude,
TRIANGULARTION);
}
/**************************************************************************************************************
Bup_updateDataFromSWS - Обновление данных СВС.
***************************************************************************************************************/
void Bup_updateDataFromSWS (void)
{
/* Пытаемся получить данные от СВС,
в случае неудача выставляем флаг неисправности */
if(SWS_update() != SWS_OK)
SelfTesting_SET_FAULT(ST_sws);
}
/**************************************************************************************************************
Bup_updateDataFromSNS - Обновление данных СНС.
***************************************************************************************************************/
void Bup_updateDataFromSNS (void)
{
SNS_Status statusPosition;
SNS_Status statusOrientation;
/* Запрашиваем данные местоположения */
statusPosition = SNS_updatePositionData();
/* Запрашиваем данные ориентации */
statusOrientation = SNS_updateOrientationData();
/* Проверяем статусы ответов */
if(statusPosition != SNS_OK || statusOrientation != SNS_OK)
SelfTesting_SET_FAULT(ST_sns);
}
/**************************************************************************************************************
Bup_updateRadiostationData - Обновление данных от радиостанции
***************************************************************************************************************/
void Bup_updateRadiostationData (void)
{
// Спрашиваем радиостанцию, и если есть новые данные, то поднимаем флаг, что они обновились
if(Radiostation.autoChecker(&bupDataStorage.radioPointLatitude,
&bupDataStorage.radioPointLongitude) == RADIO_GOT_NEW_COORDINATES)
{
#ifdef LOGS_ENABLE
logger_warning("radio: new point!");
logger_point("radio point", bupDataStorage.radioPointLatitude,
bupDataStorage.radioPointLongitude,
bupDataStorage.touchdownPointAltitude);
#endif
bupDataStorage.radioPointUpdateIndex++;
bupDataStorage.radioPointRelief = getHeightOnThisPoint(bupDataStorage.radioPointLongitude,
bupDataStorage.radioPointLatitude,
TRIANGULARTION);
if(bupDataStorage.radioPointRelief == MAP_NO_SOLUTION)
bupDataStorage.radioPointRelief = 0;
}
}
/**************************************************************************************************************
Bup_loadTouchdownPoint - Загрузка точки приземления из flash полетного задания в ОЗУ
***************************************************************************************************************/
void Bup_loadTouchdownPoint (void)
{
bupDataStorage.touchdownPointLatitude = getTouchdownLatitude(); // Подгружаем из памяти
bupDataStorage.touchdownPointLongitude = getTouchdownLongitude(); // Подгружаем из памяти
bupDataStorage.touchdownPointAltitude = getTouchdownAltitude(); // Подгружаем из памяти
// Определим высоту рельефа в точке приземления
bupDataStorage.touchdownPointRelief = getHeightOnThisPoint(bupDataStorage.touchdownPointLongitude,
bupDataStorage.touchdownPointLatitude,
TRIANGULARTION);
if(bupDataStorage.touchdownPointRelief == MAP_NO_SOLUTION)
bupDataStorage.touchdownPointRelief = 0;
}