mcu_hi3321_watch/tjd/ate/rtc/rtc_cmd_process.c
2025-05-26 20:15:20 +08:00

187 lines
4.2 KiB
C

#include "rtc_cmd_process.h"
#include "ate_at_process.h"
#include "rtc_api.h"
#include <time.h>
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(&timestamp);
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(&timestamp);
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(); }