187 lines
4.2 KiB
C
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(×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(); } |