3737#include <system/sys_log/sys_log.h>
3838
3939#include <devices/antenna/antenna.h>
40+ #include <devices/media/media.h>
41+ #include <drivers/flash/flash.h>
4042
4143#include <structs/ttc_data.h>
4244
45+ #include <libs/crc/crc.h>
46+
4347#include "antenna_deployment.h"
4448
49+ /**
50+ * \brief Saves deployment state to internal flash memory.
51+ *
52+ * \param[in] ttc is a pointer to ttc data buffer.
53+ *
54+ * \return The status/error code.
55+ */
56+ static int save_deployment_state_to_flash (ttc_data_t * ttc );
57+
58+ /**
59+ * \brief Loads deployment state from internal flash memory.
60+ *
61+ * \param[in] ttc is a pointer to ttc data buffer.
62+ *
63+ * \return The status/error code.
64+ */
65+ static int load_deployment_state_from_flash (ttc_data_t * ttc );
66+
4567xTaskHandle xTaskAntennaDeploymentHandle ;
4668
4769void vTaskAntennaDeployment (void )
4870{
71+ vTaskDelay (pdMS_TO_TICKS (TASK_ANTENNA_DEPLOYMENT_TIMEOUT_MS ));
72+
73+ if (load_deployment_state_from_flash (& ttc_data_buf ) != 0 )
74+ {
75+ sys_log_print_event_from_module (SYS_LOG_ERROR , TASK_ANTENNA_DEPLOYMENT_NAME , "Failed to load deployment state from internal flash!" );
76+ sys_log_new_line ();
77+ }
78+
4979 /* Initial hibernation */
5080 ttc_data_buf .ant_deploy_hib_count = 0 ;
5181
@@ -57,12 +87,22 @@ void vTaskAntennaDeployment(void)
5787
5888 for (i = initial_hib_time_counter ; i < CONFIG_ANTENNA_DEPLOYMENT_HIBERNATION_MIN ; i ++ )
5989 {
90+ uint32_t hib_dur = CONFIG_ANTENNA_DEPLOYMENT_HIBERNATION_MIN - (uint32_t )i ;
91+ sys_log_print_event_from_module (SYS_LOG_WARNING , TASK_ANTENNA_DEPLOYMENT_NAME , "Antenna deployment will happen in " );
92+ sys_log_print_uint (hib_dur );
93+ sys_log_print_msg (" minutes!" );
94+ sys_log_new_line ();
95+
6096 vTaskDelay (pdMS_TO_TICKS (60000U ));
6197
6298 ttc_data_buf .ant_deploy_hib_count ++ ;
99+
100+ (void )save_deployment_state_to_flash (& ttc_data_buf );
63101 }
64102
65103 ttc_data_buf .ant_deploy_hib_exec = true;
104+
105+ (void )save_deployment_state_to_flash (& ttc_data_buf );
66106 }
67107 else
68108 {
@@ -71,7 +111,7 @@ void vTaskAntennaDeployment(void)
71111 }
72112
73113 /* Antenna deployment */
74- if (ttc_data_buf .ant_deploy_count < CONFIG_ANTENNA_DEPLOYMENT_ATTEMPTS )
114+ if (ttc_data_buf .ant_deploy_count < CONFIG_ANTENNA_DEPLOYMENT_ATTEMPTS )
75115 {
76116 sys_log_print_event_from_module (SYS_LOG_INFO , TASK_ANTENNA_DEPLOYMENT_NAME , "Antenna deployment attempt number " );
77117 sys_log_print_uint (ttc_data_buf .ant_deploy_count + 1U );
@@ -89,6 +129,8 @@ void vTaskAntennaDeployment(void)
89129 ttc_data_buf .ant_deploy_count ++ ;
90130
91131 ttc_data_buf .ant_deploy_exec = true;
132+
133+ (void )save_deployment_state_to_flash (& ttc_data_buf );
92134 }
93135 else
94136 {
@@ -102,4 +144,46 @@ void vTaskAntennaDeployment(void)
102144 vTaskSuspend (xTaskAntennaDeploymentHandle );
103145}
104146
147+ static int save_deployment_state_to_flash (ttc_data_t * ttc )
148+ {
149+ int err = -1 ;
150+ uint8_t buf [5 ] = {0 };
151+
152+ if (media_erase (MEDIA_INT_FLASH , FLASH_SEG_C_ADR ) == 0 )
153+ {
154+ buf [0 ] = ttc -> ant_deploy_hib_count ;
155+ buf [1 ] = ttc -> ant_deploy_exec ;
156+ buf [2 ] = ttc -> ant_deploy_count ;
157+ buf [3 ] = ttc -> ant_deploy_hib_exec ;
158+ buf [4 ] = crc8_get_val (buf , 4U );
159+
160+ err = media_write (MEDIA_INT_FLASH , 0U , FLASH_SEG_C_ADR , buf , 5U );
161+ }
162+
163+ return err ;
164+ }
165+
166+ static int load_deployment_state_from_flash (ttc_data_t * ttc )
167+ {
168+ int err = -1 ;
169+
170+ uint8_t buf [5 ] = {0 };
171+
172+ /* Getting the previous reset count parameter */
173+ if (media_read (MEDIA_INT_FLASH , 0U , FLASH_SEG_C_ADR , buf , 5U ) == 0 )
174+ {
175+ if (buf [4 ] == crc8_get_val (buf , 4U ))
176+ {
177+ ttc -> ant_deploy_hib_count = buf [0 ];
178+ ttc -> ant_deploy_exec = buf [1 ];
179+ ttc -> ant_deploy_count = buf [2 ];
180+ ttc -> ant_deploy_hib_exec = buf [3 ];
181+
182+ err = 0 ;
183+ }
184+ }
185+
186+ return err ;
187+ }
188+
105189/** \} End of antenna_deployment group */
0 commit comments