Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ADCS commissioning #215

Merged
merged 26 commits into from
Feb 5, 2025
Merged
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c7bda96
fix numbers of telecommand args
DeemDeem52 Oct 5, 2024
9777f58
snprintf doesn't support floats
DeemDeem52 Oct 5, 2024
de7b504
Updated flash driver and littlefs helper to use NAND memory module (M…
KaleF07 Oct 6, 2024
6266845
Create Current ACP Status commands
DeemDeem52 Oct 9, 2024
c437f7f
Create Current ADCS State 1 command
DeemDeem52 Oct 9, 2024
1e7cffe
Create commissioning structs
DeemDeem52 Oct 14, 2024
b7e8868
Create Raw Star Tracker command
DeemDeem52 Oct 16, 2024
aaf6668
Create Save Image command
DeemDeem52 Oct 16, 2024
1d7b353
Create TCMDEXEC_adcs_request_commissioning_telemetry
DeemDeem52 Oct 19, 2024
e8eecb4
Minor change: lowercase function names
DeemDeem52 Oct 19, 2024
16a5bd4
Merge branch 'main' into nadeem-adcs-commissioning
DeemDeem52 Oct 19, 2024
5050a52
Create delayed and repeated telecommand functions
DeemDeem52 Oct 23, 2024
900081a
minor bugfix
DeemDeem52 Oct 26, 2024
6e7e0d2
ADCS Unix time telecommands
DeemDeem52 Oct 30, 2024
9db0127
Create SD Log Config commands
DeemDeem52 Nov 2, 2024
ebd7516
Update request_commissioning_telemetry with SD logger command
DeemDeem52 Nov 6, 2024
bafd10d
Update printing doubles to JSON
DeemDeem52 Nov 20, 2024
4f750eb
Double-to-string unit test
DeemDeem52 Nov 20, 2024
6a3589c
minor bugfix
DeemDeem52 Nov 23, 2024
bd60831
Merge branch 'main' into nadeem-adcs-commissioning
DeemDeem52 Nov 27, 2024
7f948c6
minor comment change
DeemDeem52 Nov 27, 2024
e465327
documentation change
DeemDeem52 Nov 27, 2024
68f3d37
timekeeping and float bugfixes
DeemDeem52 Dec 7, 2024
1778f36
minor docs changes
DeemDeem52 Dec 7, 2024
9e37eef
Add checks, clean comments, and remove unnecessary functions
DeemDeem52 Jan 22, 2025
67e92d0
Merge branch 'main' into nadeem-adcs-commissioning
DeemDeem52 Jan 22, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
ADCS Unix time telecommands
DeemDeem52 committed Oct 30, 2024
commit 6e7e0d2e584333293240ef83dce1bc3c50c256a6
2 changes: 2 additions & 0 deletions firmware/Core/Inc/adcs_drivers/adcs_commands.h
Original file line number Diff line number Diff line change
@@ -125,5 +125,7 @@ uint8_t ADCS_get_acp_execution_state(ADCS_acp_execution_state_struct_t *output_s
uint8_t ADCS_get_current_state_1(ADCS_current_state_1_struct_t *output_struct);
uint8_t ADCS_get_raw_star_tracker_data(ADCS_raw_star_tracker_struct_t *output_struct);
uint8_t ADCS_save_image_to_sd(ADCS_camera_select_enum_t camera_select, ADCS_image_size_enum_t image_size);
uint8_t ADCS_get_current_unix_time();
uint8_t ADCS_set_current_unix_time();

#endif /* INC_ADCS_COMMANDS_H_ */
1 change: 1 addition & 0 deletions firmware/Core/Inc/adcs_drivers/adcs_struct_packers.h
Original file line number Diff line number Diff line change
@@ -45,5 +45,6 @@ uint8_t ADCS_pack_to_measurements_struct(uint8_t* telemetry_data, ADCS_measureme
uint8_t ADCS_pack_to_acp_execution_state_struct(uint8_t* data_received, ADCS_acp_execution_state_struct_t* output_struct);
uint8_t ADCS_pack_to_current_state_1_struct(uint8_t* data_received, ADCS_current_state_1_struct_t* output_struct);
uint8_t ADCS_pack_to_raw_star_tracker_struct(uint8_t* input_data, ADCS_raw_star_tracker_struct_t* output_data);
uint8_t ADCS_pack_to_unix_time_ms(uint8_t *data_received, uint64_t *output_data);

#endif /* INC_ADCS_STRUCT_PACKERS_H_ */
1 change: 1 addition & 0 deletions firmware/Core/Inc/adcs_drivers/adcs_types_to_json.h
Original file line number Diff line number Diff line change
@@ -50,5 +50,6 @@ uint8_t ADCS_generic_telemetry_uint8_array_TO_json(const uint8_t *data, const ui
uint8_t ADCS_acp_execution_struct_TO_json(const ADCS_acp_execution_state_struct_t *data, char json_output_str[], uint16_t json_output_str_len);
uint8_t ADCS_current_state_1_struct_TO_json(const ADCS_current_state_1_struct_t *data, char json_output_str[], uint16_t json_output_str_len);
uint8_t ADCS_raw_star_tracker_struct_TO_json(const ADCS_raw_star_tracker_struct_t *data, char json_output_str[], uint16_t json_output_str_len);
uint8_t ADCS_unix_time_ms_TO_json(const uint64_t *data, char json_output_str[], uint16_t json_output_str_len);

#endif /* INC_ADCS_TYPES_TO_JSON_H_ */
5 changes: 4 additions & 1 deletion firmware/Core/Inc/telecommands/telecommand_adcs.h
Original file line number Diff line number Diff line change
@@ -220,7 +220,10 @@ uint8_t TCMDEXEC_adcs_save_image_to_sd(const char *args_str, TCMD_TelecommandCha
uint8_t TCMDEXEC_adcs_request_commissioning_telemetry(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
char *response_output_buf, uint16_t response_output_buf_len);

uint8_t test_telecommand_delaying(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
uint8_t TCMDEXEC_adcs_set_current_unix_time(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
char *response_output_buf, uint16_t response_output_buf_len);

uint8_t TCMDEXEC_adcs_get_current_unix_time(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
char *response_output_buf, uint16_t response_output_buf_len);

#endif // __INCLUDE_GUARD__TELECOMMAND_adcs_H
1 change: 1 addition & 0 deletions firmware/Core/Inc/unit_tests/test_adcs.h
Original file line number Diff line number Diff line change
@@ -46,6 +46,7 @@ uint8_t TEST_EXEC__ADCS_pack_to_measurements_struct();
uint8_t TEST_EXEC__ADCS_pack_to_acp_execution_state_struct();
uint8_t TEST_EXEC__ADCS_pack_to_current_state_1_struct();
uint8_t TEST_EXEC__ADCS_pack_to_raw_star_tracker_struct();
uint8_t TEST_EXEC__ADCS_pack_to_unix_time_ms();

#endif // __INCLUDE_GUARD__ADCS_TEST_PROTOTYPES_H__

31 changes: 31 additions & 0 deletions firmware/Core/Src/adcs_drivers/adcs_commands.c
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@
#include "adcs_drivers/adcs_types_to_json.h"
#include "adcs_drivers/adcs_commands.h"
#include "adcs_drivers/adcs_internal_drivers.h"
#include "timekeeping/timekeeping.h"
#include <string.h>
#include <stdio.h>
#include <stdbool.h>
@@ -1062,4 +1063,34 @@ uint8_t ADCS_save_image_to_sd(ADCS_camera_select_enum_t camera_select, ADCS_imag
uint8_t data_send[2] = {camera_select, image_size};
uint8_t cmd_status = ADCS_i2c_send_command_and_check(ADCS_COMMAND_SAVE_IMAGE, data_send, sizeof(data_send), ADCS_INCLUDE_CHECKSUM);
return cmd_status;
}

/// @brief Instruct the ADCS to synchronise its Unix epoch time to the current OBC Unix time.
/// @return 0 if successful, non-zero if a HAL or ADCS error occurred in transmission.
uint8_t ADCS_set_current_unix_time() {
uint64_t current_unix_time_ms = TIM_get_current_unix_epoch_time_ms();

uint32_t s_component = current_unix_time_ms / 1000;
uint16_t ms_component = current_unix_time_ms % 1000;

uint8_t data_send[6];
ADCS_convert_uint32_to_reversed_uint8_array_members(data_send, s_component, 0);
ADCS_convert_uint16_to_reversed_uint8_array_members(data_send, ms_component, 4);

uint8_t cmd_status = ADCS_i2c_send_command_and_check(ADCS_COMMAND_SET_CURRENT_UNIX_TIME, data_send, sizeof(data_send), ADCS_INCLUDE_CHECKSUM);
return cmd_status;
}

/// @brief Instruct the ADCS to execute the ADCS_get_current_unix_time command.
/// @param epoch_time_ms Pointer to uint64 to store the time since the Unix epoch in ms, according to the ADCS
/// @return 0 if successful, non-zero if a HAL or ADCS error occurred in transmission.
uint8_t ADCS_get_current_unix_time(uint64_t* epoch_time_ms) {
uint8_t data_length = 6;
uint8_t data_received[data_length]; // define temp buffer

uint8_t tlm_status = ADCS_i2c_request_telemetry_and_check(ADCS_TELEMETRY_GET_CURRENT_UNIX_TIME, data_received, data_length, ADCS_INCLUDE_CHECKSUM); // populate buffer

ADCS_pack_to_unix_time_ms(data_received, epoch_time_ms);

return tlm_status;
}
8 changes: 8 additions & 0 deletions firmware/Core/Src/adcs_drivers/adcs_struct_packers.c
Original file line number Diff line number Diff line change
@@ -692,4 +692,12 @@ uint8_t ADCS_pack_to_raw_star_tracker_struct(uint8_t *input_data, ADCS_raw_star_
output_data->q2_micro = (int32_t) ((int16_t) ((input_data[53] << 8) | input_data[52])) * 100;

return 0;
}

uint8_t ADCS_pack_to_unix_time_ms(uint8_t *data_received, uint64_t *output_data) {

// use ULL to perform unsigned, not signed, multiplication
*output_data = ((data_received[3] << 24 | data_received[2] << 16 | data_received[1] << 8 | data_received[0]) * 1000ULL) + ((data_received[5] << 8) | data_received[4]);
return 0;

}
17 changes: 17 additions & 0 deletions firmware/Core/Src/adcs_drivers/adcs_types_to_json.c
Original file line number Diff line number Diff line change
@@ -1124,5 +1124,22 @@ uint8_t ADCS_raw_star_tracker_struct_TO_json(const ADCS_raw_star_tracker_struct_
return 3; // Error: string buffer too short
}

return 0;
}

uint8_t ADCS_unix_time_ms_TO_json(const uint64_t *data, char json_output_str[], uint16_t json_output_str_len) {
if (data == NULL || json_output_str == NULL || json_output_str_len < 50) {
return 1; // Error: invalid input or too short buffer
}

int16_t snprintf_ret = snprintf(json_output_str, json_output_str_len,"{\"current_adcs_unix_time\":%llu}",*data);

if (snprintf_ret < 0) {
return 2; // Error: snprintf encoding error
}
if (snprintf_ret >= json_output_str_len) {
return 3; // Error: string buffer too short
}

return 0;
}
38 changes: 38 additions & 0 deletions firmware/Core/Src/telecommands/telecommand_adcs.c
Original file line number Diff line number Diff line change
@@ -1769,6 +1769,44 @@ uint8_t TCMDEXEC_adcs_save_image_to_sd(const char *args_str, TCMD_TelecommandCha
return status;
}

/// @brief Telecommand: Synchronise the current ADCS Unix epoch time
/// @param args_str
/// - No arguments for this command
/// @return 0 on success, >0 on error
uint8_t TCMDEXEC_adcs_set_current_unix_time(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
char *response_output_buf, uint16_t response_output_buf_len) {
uint8_t status = ADCS_set_current_unix_time();
return status;
}

/// @brief Telecommand: Retrieve the current ADCS Unix epoch time
/// @param args_str
/// - No arguments for this command
/// @return 0 on success, >0 on error
uint8_t TCMDEXEC_adcs_get_current_unix_time(const char *args_str, TCMD_TelecommandChannel_enum_t tcmd_channel,
char *response_output_buf, uint16_t response_output_buf_len) {

uint64_t unix_time_ms;
uint8_t status = ADCS_get_current_unix_time(&unix_time_ms);

if (status != 0) {
snprintf(response_output_buf, response_output_buf_len,
"ADCS Unix time telemetry request failed (err %d)", status);
return 1;
}

const uint8_t result_json = ADCS_unix_time_ms_TO_json(
&unix_time_ms, response_output_buf, response_output_buf_len);

if (result_json != 0) {
snprintf(response_output_buf, response_output_buf_len,
"ADCS Unix time telemetry JSON conversion failed (err %d)", result_json);
return 2;
}

return status;
}

// TODO: agenda modification for repeating
/// @brief Telecommand: Request commissioning telemetry from the ADCS and save it to the memory module
/// @param args_str
13 changes: 13 additions & 0 deletions firmware/Core/Src/telecommands/telecommand_definitions.c
Original file line number Diff line number Diff line change
@@ -681,7 +681,20 @@ const TCMD_TelecommandDefinition_t TCMD_telecommand_definitions[] = {
.tcmd_func = TCMDEXEC_adcs_request_commissioning_telemetry,
.number_of_args = 1,
.readiness_level = TCMD_READINESS_LEVEL_FOR_OPERATION,
},
{
.tcmd_name = "adcs_set_current_unix_time",
.tcmd_func = TCMDEXEC_adcs_set_current_unix_time,
.number_of_args = 0,
.readiness_level = TCMD_READINESS_LEVEL_FOR_OPERATION,
},
{
.tcmd_name = "adcs_get_current_unix_time",
.tcmd_func = TCMDEXEC_adcs_get_current_unix_time,
.number_of_args = 0,
.readiness_level = TCMD_READINESS_LEVEL_FOR_OPERATION,
},

// ****************** END SECTION: telecommand_adcs ******************

// ****************** SECTION: log_telecommand_defs ******************
11 changes: 11 additions & 0 deletions firmware/Core/Src/unit_tests/test_adcs.c
Original file line number Diff line number Diff line change
@@ -745,3 +745,14 @@ uint8_t TEST_EXEC__ADCS_pack_to_raw_star_tracker_struct() {

return 0;
}


uint8_t TEST_EXEC__ADCS_pack_to_unix_time_ms() {
uint8_t input_params[6] = {0x56, 0x8b, 0x21, 0x67, 0x62, 0x02};
uint64_t result;

ADCS_pack_to_unix_time_ms(input_params, &result);
TEST_ASSERT_TRUE(result == 1730251606610);

return 0;
}
6 changes: 6 additions & 0 deletions firmware/Core/Src/unit_tests/unit_test_inventory.c
Original file line number Diff line number Diff line change
@@ -300,6 +300,12 @@ const TEST_Definition_t TEST_definitions[] = {
.test_func_name = "ADCS_pack_to_raw_star_tracker_struct"
},

{
.test_func = TEST_EXEC__ADCS_pack_to_unix_time_ms,
.test_file = "unit_tests/test_adcs",
.test_func_name = "ADCS_pack_to_unix_time_ms"
},

// ****************** END SECTION: test_adcs ******************

{