Lines Matching full:client
9 * 2018-04-12 chenyong add client implement
10 * 2018-08-17 chenyong multiple client support
269 * @param client current AT client object
277 int at_obj_exec_cmd(at_client_t client, at_response_t resp, const char *cmd_expr, ...) in at_obj_exec_cmd() argument
286 if (client == RT_NULL) in at_obj_exec_cmd()
288 LOG_E("input AT Client object is NULL, please create or get AT Client object!"); in at_obj_exec_cmd()
292 rt_mutex_take(client->lock, RT_WAITING_FOREVER); in at_obj_exec_cmd()
294 client->resp_status = AT_RESP_OK; in at_obj_exec_cmd()
295 client->resp = resp; in at_obj_exec_cmd()
298 at_vprintfln(client->device, cmd_expr, args); in at_obj_exec_cmd()
304 if (rt_sem_take(client->resp_notice, resp->timeout) != RT_EOK) in at_obj_exec_cmd()
308 client->resp_status = AT_RESP_TIMEOUT; in at_obj_exec_cmd()
312 if (client->resp_status != AT_RESP_OK) in at_obj_exec_cmd()
322 client->resp = RT_NULL; in at_obj_exec_cmd()
324 rt_mutex_release(client->lock); in at_obj_exec_cmd()
332 * @param client current AT client object
339 int at_client_obj_wait_connect(at_client_t client, rt_uint32_t timeout) in at_client_obj_wait_connect() argument
345 if (client == RT_NULL) in at_client_obj_wait_connect()
347 LOG_E("input AT Client object is NULL, please create or get AT Client object!"); in at_client_obj_wait_connect()
358 rt_mutex_take(client->lock, RT_WAITING_FOREVER); in at_client_obj_wait_connect()
359 client->resp = resp; in at_client_obj_wait_connect()
375 rt_device_write(client->device, 0, "AT\r\n", 4); in at_client_obj_wait_connect()
377 if (rt_sem_take(client->resp_notice, resp->timeout) != RT_EOK) in at_client_obj_wait_connect()
385 client->resp = RT_NULL; in at_client_obj_wait_connect()
387 rt_mutex_release(client->lock); in at_client_obj_wait_connect()
395 * @param client current AT client object
402 rt_size_t at_client_obj_send(at_client_t client, const char *buf, rt_size_t size) in at_client_obj_send() argument
406 if (client == RT_NULL) in at_client_obj_send()
408 LOG_E("input AT Client object is NULL, please create or get AT Client object!"); in at_client_obj_send()
416 return rt_device_write(client->device, 0, buf, size); in at_client_obj_send()
419 static rt_err_t at_client_getchar(at_client_t client, char *ch, rt_int32_t timeout) in at_client_getchar() argument
423 while (rt_device_read(client->device, 0, ch, 1) == 0) in at_client_getchar()
425 rt_sem_control(client->rx_notice, RT_IPC_CMD_RESET, RT_NULL); in at_client_getchar()
427 result = rt_sem_take(client->rx_notice, rt_tick_from_millisecond(timeout)); in at_client_getchar()
438 * AT client receive fixed-length data.
440 * @param client current AT client object
450 rt_size_t at_client_obj_recv(at_client_t client, char *buf, rt_size_t size, rt_int32_t timeout) in at_client_obj_recv() argument
458 if (client == RT_NULL) in at_client_obj_recv()
460 LOG_E("input AT Client object is NULL, please create or get AT Client object!"); in at_client_obj_recv()
468 result = at_client_getchar(client, &ch, timeout); in at_client_obj_recv()
471 LOG_E("AT Client receive failed, uart device get data error(%d)", result); in at_client_obj_recv()
491 * AT client set end sign.
493 * @param client current AT client object
496 void at_obj_set_end_sign(at_client_t client, char ch) in at_obj_set_end_sign() argument
498 if (client == RT_NULL) in at_obj_set_end_sign()
500 LOG_E("input AT Client object is NULL, please create or get AT Client object!"); in at_obj_set_end_sign()
504 client->end_sign = ch; in at_obj_set_end_sign()
510 * @param client current AT client object
514 void at_obj_set_urc_table(at_client_t client, const struct at_urc *urc_table, rt_size_t table_sz) in at_obj_set_urc_table() argument
518 if (client == RT_NULL) in at_obj_set_urc_table()
520 LOG_E("input AT Client object is NULL, please create or get AT Client object!"); in at_obj_set_urc_table()
530 client->urc_table = urc_table; in at_obj_set_urc_table()
531 client->urc_table_size = table_sz; in at_obj_set_urc_table()
535 * get AT client object by AT device name.
537 * @dev_name AT client device name
539 * @return AT client object
559 * get first AT client object in the table.
561 * @return AT client object
573 static const struct at_urc *get_urc_obj(at_client_t client) in get_urc_obj() argument
579 if (client->urc_table == RT_NULL) in get_urc_obj()
584 buffer = client->recv_buffer; in get_urc_obj()
585 buf_sz = client->cur_recv_len; in get_urc_obj()
587 for (i = 0; i < client->urc_table_size; i++) in get_urc_obj()
589 prefix_len = strlen(client->urc_table[i].cmd_prefix); in get_urc_obj()
590 suffix_len = strlen(client->urc_table[i].cmd_suffix); in get_urc_obj()
595 if ((prefix_len ? !strncmp(buffer, client->urc_table[i].cmd_prefix, prefix_len) : 1) in get_urc_obj()
596 …&& (suffix_len ? !strncmp(buffer + buf_sz - suffix_len, client->urc_table[i].cmd_suffix, suffix_le… in get_urc_obj()
598 return &client->urc_table[i]; in get_urc_obj()
605 static int at_recv_readline(at_client_t client) in at_recv_readline() argument
611 memset(client->recv_buffer, 0x00, client->recv_bufsz); in at_recv_readline()
612 client->cur_recv_len = 0; in at_recv_readline()
616 at_client_getchar(client, &ch, RT_WAITING_FOREVER); in at_recv_readline()
618 if (read_len < client->recv_bufsz) in at_recv_readline()
620 client->recv_buffer[read_len++] = ch; in at_recv_readline()
621 client->cur_recv_len = read_len; in at_recv_readline()
629 if ((ch == '\n' && last_ch == '\r') || (client->end_sign != 0 && ch == client->end_sign) in at_recv_readline()
630 || get_urc_obj(client)) in at_recv_readline()
634 … LOG_E("read line failed. The line data length is out of buffer size(%d)!", client->recv_bufsz); in at_recv_readline()
635 memset(client->recv_buffer, 0x00, client->recv_bufsz); in at_recv_readline()
636 client->cur_recv_len = 0; in at_recv_readline()
645 at_print_raw_cmd("recvline", client->recv_buffer, read_len); in at_recv_readline()
651 static void client_parser(at_client_t client) in client_parser() argument
659 if (at_recv_readline(client) > 0) in client_parser()
661 if ((urc = get_urc_obj(client)) != RT_NULL) in client_parser()
666 urc->func(client->recv_buffer, client->cur_recv_len); in client_parser()
669 else if (client->resp != RT_NULL) in client_parser()
672 client->recv_buffer[client->cur_recv_len - 1] = '\0'; in client_parser()
673 if (resp_buf_len + client->cur_recv_len < client->resp->buf_size) in client_parser()
676 … memcpy(client->resp->buf + resp_buf_len, client->recv_buffer, client->cur_recv_len); in client_parser()
677 resp_buf_len += client->cur_recv_len; in client_parser()
683 client->resp_status = AT_RESP_BUFF_FULL; in client_parser()
684 …ponse buffer failed. The Response buffer size is out of buffer size(%d)!", client->resp->buf_size); in client_parser()
687 if (memcmp(client->recv_buffer, AT_RESP_END_OK, strlen(AT_RESP_END_OK)) == 0 in client_parser()
688 && client->resp->line_num == 0) in client_parser()
691 client->resp_status = AT_RESP_OK; in client_parser()
693 else if (strstr(client->recv_buffer, AT_RESP_END_ERROR) in client_parser()
694 … || (memcmp(client->recv_buffer, AT_RESP_END_FAIL, strlen(AT_RESP_END_FAIL)) == 0)) in client_parser()
696 client->resp_status = AT_RESP_ERROR; in client_parser()
698 else if (line_counts == client->resp->line_num && client->resp->line_num) in client_parser()
701 client->resp_status = AT_RESP_OK; in client_parser()
707 client->resp->line_counts = line_counts; in client_parser()
709 client->resp = RT_NULL; in client_parser()
710 rt_sem_release(client->resp_notice); in client_parser()
715 // log_d("unrecognized line: %.*s", client->cur_recv_len, client->recv_buffer); in client_parser()
736 /* initialize the client object parameters */
737 static int at_client_para_init(at_client_t client) in at_client_para_init() argument
748 client->status = AT_STATUS_UNINITIALIZED; in at_client_para_init()
750 client->cur_recv_len = 0; in at_client_para_init()
751 client->recv_buffer = (char *) rt_calloc(1, client->recv_bufsz); in at_client_para_init()
752 if (client->recv_buffer == RT_NULL) in at_client_para_init()
754 LOG_E("AT client initialize failed! No memory for receive buffer."); in at_client_para_init()
760 client->lock = rt_mutex_create(name, RT_IPC_FLAG_FIFO); in at_client_para_init()
761 if (client->lock == RT_NULL) in at_client_para_init()
763 LOG_E("AT client initialize failed! at_client_recv_lock create failed!"); in at_client_para_init()
769 client->rx_notice = rt_sem_create(name, 0, RT_IPC_FLAG_FIFO); in at_client_para_init()
770 if (client->rx_notice == RT_NULL) in at_client_para_init()
772 LOG_E("AT client initialize failed! at_client_notice semaphore create failed!"); in at_client_para_init()
778 client->resp_notice = rt_sem_create(name, 0, RT_IPC_FLAG_FIFO); in at_client_para_init()
779 if (client->resp_notice == RT_NULL) in at_client_para_init()
781 LOG_E("AT client initialize failed! at_client_resp semaphore create failed!"); in at_client_para_init()
786 client->urc_table = RT_NULL; in at_client_para_init()
787 client->urc_table_size = 0; in at_client_para_init()
790 client->parser = rt_thread_create(name, in at_client_para_init()
792 client, in at_client_para_init()
796 if (client->parser == RT_NULL) in at_client_para_init()
805 if (client->lock) in at_client_para_init()
807 rt_mutex_delete(client->lock); in at_client_para_init()
810 if (client->rx_notice) in at_client_para_init()
812 rt_sem_delete(client->rx_notice); in at_client_para_init()
815 if (client->resp_notice) in at_client_para_init()
817 rt_sem_delete(client->resp_notice); in at_client_para_init()
820 if (client->device) in at_client_para_init()
822 rt_device_close(client->device); in at_client_para_init()
825 if (client->recv_buffer) in at_client_para_init()
827 rt_free(client->recv_buffer); in at_client_para_init()
830 rt_memset(client, 0x00, sizeof(struct at_client)); in at_client_para_init()
841 * AT client initialize.
843 * @param dev_name AT client device name
855 at_client_t client = RT_NULL; in at_client_init() local
864 …LOG_E("AT client initialize failed! Check the maximum number(%d) of AT client.", AT_CLIENT_NUM_MAX… in at_client_init()
869 client = &at_client_table[idx]; in at_client_init()
870 client->recv_bufsz = recv_bufsz; in at_client_init()
873 client->device = rt_device_find(dev_name); in at_client_init()
874 if (client->device) in at_client_init()
876 RT_ASSERT(client->device->type == RT_Device_Class_Char); in at_client_init()
879 open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); in at_client_init()
883 … open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); in at_client_init()
887 rt_device_set_rx_indicate(client->device, at_client_rx_ind); in at_client_init()
891 LOG_E("AT client initialize failed! Not find the device(%s).", dev_name); in at_client_init()
896 result = at_client_para_init(client); in at_client_init()
905 client->status = AT_STATUS_INITIALIZED; in at_client_init()
907 rt_thread_startup(client->parser); in at_client_init()
909 LOG_I("AT client(V%s) on device %s initialize success.", AT_SW_VERSION, dev_name); in at_client_init()
913 … LOG_E("AT client(V%s) on device %s initialize failed(%d).", AT_SW_VERSION, dev_name, result); in at_client_init()