#include "rtc_cmd_process.h" #include "ate_at_process.h" #include "rtc_api.h" #include struct rtc_class_ops *g_rtc_api; static int64_t str_to_num(const uint8_t *str, uint32_t len) { int64_t num = 0; uint32_t i = 0; uint8_t c; for (i = 0; i < len; i++) { c = str[i]; if (c >= '0' && c <= '9') { num = num * 10 + c - '0'; } else { return -1; } } return num; } static result_t rtc_set_time(uint8_t *para, uint32_t para_len) { result_t result = {0}; struct rtc_time time = {0}; result.code = tjd_driver_rtc_parse_str((const char *)para, &time); if (result.code != 0) { return result; } result.code = g_rtc_api->set_rtc_time(&time); if (result.code != 0) { return result; } return result; } static result_t rtc_get_time(void) { result_t result = {0}; struct rtc_time time = {0}; result.code = g_rtc_api->get_rtc_time(&time); if (result.code != 0) { return result; } memset(result.msg, 0, sizeof(result.msg)); result.code = tjd_driver_rtc_parse_time(&time, (char *)result.msg); if (result.code != 0) { return result; } result.len = strlen((const char *)result.msg); return result; } static result_t rtc_set_timestamp(uint8_t *para, uint32_t para_len) { result_t result = {0}; uint64_t timestamp = 0; int32_t argc = 0; uint8_t *argv[25]; convert_at_param(para, para_len, &argc, argv); timestamp = str_to_num(argv[0], strlen((const char *)argv[0])); result.code = g_rtc_api->set_timestamp(timestamp); if (result.code != 0) { return result; } free_argv(argv, argc); return result; } static result_t rtc_get_timestamp(void) { result_t result = {0}; uint64_t timestamp = 0; result.code = g_rtc_api->get_timestamp(×tamp); if (result.code != 0) { return result; } result.len = snprintf((char *)result.msg, sizeof(result.msg), "%lld", timestamp); return result; } static result_t rtc_set_diff_time(uint8_t *para, uint32_t para_len) { result_t result = {0}; int32_t argc = 0; uint8_t *argv[25]; convert_at_param(para, para_len, &argc, argv); if (argc >= 2) { result.code = -1; return result; } int64_t diff = str_to_num(argv[0], strlen((const char *)argv[0])); result.code = g_rtc_api->set_diff(diff); if (result.code != 0) { return result; } free_argv(argv, argc); return result; } static result_t rtc_get_diff_time(void) { result_t result = {0}; unsigned long offset = 0; result.code = g_rtc_api->get_diff(&offset); if (result.code != 0) { return result; } result.len = snprintf((char *)result.msg, sizeof(result.msg), "%ld", offset); return result; } result_t rtc_time(uint8_t *para, uint32_t para_len) { if (para_len == 0) { return rtc_get_time(); } return rtc_set_time(para, para_len); } result_t rtc_timestamp(uint8_t *para, uint32_t para_len) { if (para_len == 0) { return rtc_get_timestamp(); } return rtc_set_timestamp(para, para_len); } result_t rtc_ms_timestamp(uint8_t *para, uint32_t para_len) { result_t result = {0}; uint64_t timestamp = 0; result.code = g_rtc_api->get_ms_timestamp(×tamp); if (result.code != 0) { return result; } result.len = snprintf((char *)result.msg, sizeof(result.msg), "%lld", timestamp); return result; } result_t rtc_diff_time(uint8_t *para, uint32_t para_len) { if (para_len == 0) { return rtc_get_diff_time(); } return rtc_set_diff_time(para, para_len); } result_t rtc_sync_bt_time(uint8_t *para, uint32_t para_len) { result_t result = {0}; uint8_t date[] = {0xab, 0x0b, 0x04, 0x01, 0x18, 0x06, 0x0f, 0x0b, 0x31, 0x24, 0xb1}; result.code = tjd_driver_rtc_sync_bt_time(date, sizeof(date)); if (result.code != 0) { return result; } return result; } void rtc_cmd_process_init(void) { g_rtc_api = tjd_driver_rtc_get_ops(); }