#include #include #include #include "fr30xx.h" #include "co_util.h" #include "bt_types.h" #include "me_api.h" #include "hfg_api.h" #include "gatt_api.h" #include "app_at.h" #include "app_task.h" #include "app_ble.h" #define AT_RECV_MAX_LEN 32 static uint8_t app_at_recv_char; static uint8_t at_recv_buffer[AT_RECV_MAX_LEN]; static uint8_t at_recv_index = 0; static uint8_t at_recv_state = 0; void btdm_host_send_vendor_cmd(uint8_t type, uint8_t length, void *data); void btdm_host_vendor_cmd_cmp_evt(uint8_t status, uint8_t len, uint8_t const *param) { printf("status: 0x%02x.\r\n", status); for (uint32_t i=0; i= 1000) { mini_second = 0; second++; if (second >= 60) { second = 0; minute++; if (minute >= 60) { minute = 0; hour++; } } } gsensor_cmd[5] = hour; gsensor_cmd[6] = minute; gsensor_cmd[7] = second; gsensor_cmd[8] = mini_second; gsensor_cmd[9] = mini_second >> 8; btdm_host_send_vendor_cmd(0x12, sizeof(gsensor_cmd), gsensor_cmd); } break; case 'G': printf("hello world!\r\n"); break; case 'H': printf("VAL: 0x%08x.\r\n", *(volatile uint32_t *)ascii_strn2val((const char *)&data[0], 16, 8)); break; case 'I': *(volatile uint32_t *)ascii_strn2val((const char *)&data[0], 16, 8) = ascii_strn2val((const char *)&data[9], 16, 8); printf("OK\r\n"); break; case 'J': printf("OOL VAL: 0x%02x.\r\n", ool_read(ascii_strn2val((const char *)&data[0], 16, 2))); break; case 'K': ool_write(ascii_strn2val((const char *)&data[0], 16, 2), ascii_strn2val((const char *)&data[3], 16, 2)); printf("OK\r\n"); break; case 'L': printf("VAL: 0x%02x.\r\n", *(volatile uint8_t *)(ascii_strn2val((const char *)&data[0], 16, 8))); break; case 'M': *(volatile uint8_t *)(ascii_strn2val((const char *)&data[0], 16, 8)) = ascii_strn2val((const char *)&data[9], 16, 2); printf("OK\r\n"); break; // case 'P': // co_printf("VAL: 0x%02x.\r\n", *(uint8_t *)(MODEM_BASE + ascii_strn2val((const char *)&data[0], 16, 2))); // break; // case 'Q': // *(uint8_t *)(MODEM_BASE + ascii_strn2val((const char *)&data[0], 16, 2)) = ascii_strn2val((const char *)&data[3], 16, 2); // co_printf("OK\r\n"); // break; // case 'S': // co_printf("VAL: 0x%02x.\r\n", frspim_rd(FR_SPI_RF_COB_CHAN, ascii_strn2val((const char *)&data[0], 16, 2), 1)); // break; // case 'T': // frspim_wr(FR_SPI_RF_COB_CHAN, ascii_strn2val((const char *)&data[0], 16, 2), 1, ascii_strn2val((const char *)&data[3], 16, 2)); // co_printf("OK\r\n"); // break; case 'U': { uint32_t *ptr = (uint32_t *)(ascii_strn2val((const char *)&data[0], 16, 8) & (~3)); uint8_t count = ascii_strn2val((const char *)&data[9], 16, 2); uint32_t *start = (uint32_t *)((uint32_t)ptr & (~0x0f)); for(uint8_t i=0; i= AT_RECV_MAX_LEN)) { struct app_task_event *event; event = app_task_event_alloc(APP_TASK_EVENT_AT_CMD, at_recv_index, false); if(event) { memcpy(event->param, at_recv_buffer, at_recv_index); app_task_event_post(event, false); } at_recv_state = 0; at_recv_index = 0; } break; } } void app_at_rx_done(struct __UART_HandleTypeDef *handle) { app_at_recv_c(app_at_recv_char); if (handle) { uart_receive_IT(handle, &app_at_recv_char, 1); } } void app_at_init(struct __UART_HandleTypeDef *handle) { uart_receive_IT(handle, &app_at_recv_char, 1); }