2020-09-26 13:50:55 +00:00
|
|
|
|
/******************************************************************************
|
|
|
|
|
* @brief AT<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>(OS<EFBFBD>汾)
|
|
|
|
|
*
|
2020-12-04 12:54:26 +00:00
|
|
|
|
* Copyright (c) 2020, <morro_luo@163.com>
|
2020-09-26 13:50:55 +00:00
|
|
|
|
*
|
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
|
*
|
|
|
|
|
* Change Logs:
|
|
|
|
|
* Date Author Notes
|
|
|
|
|
* 2020-01-02 Morro Initial version.
|
|
|
|
|
******************************************************************************/
|
|
|
|
|
|
2020-09-22 14:14:09 +00:00
|
|
|
|
#ifndef _AT_H_
|
|
|
|
|
#define _AT_H_
|
|
|
|
|
|
|
|
|
|
#include "at_util.h"
|
|
|
|
|
#include "list.h"
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
|
|
|
|
#define MAX_AT_CMD_LEN 64
|
|
|
|
|
|
|
|
|
|
struct at_obj; /*AT<41><54><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
|
|
|
|
/*urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -----------------------------------------------------------------*/
|
|
|
|
|
typedef struct {
|
|
|
|
|
const char *prefix; //URCǰ
|
|
|
|
|
void (*handler)(char *recvbuf, int size);
|
|
|
|
|
}utc_item_t;
|
|
|
|
|
|
|
|
|
|
/*AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -------------------------------------------------------------------*/
|
|
|
|
|
typedef struct {
|
|
|
|
|
/*<2A><><EFBFBD>ݶ<EFBFBD>д<EFBFBD>ӿ<EFBFBD> -----------------------------------------------------------*/
|
|
|
|
|
unsigned int (*read)(void *buf, unsigned int len);
|
|
|
|
|
unsigned int (*write)(const void *buf, unsigned int len);
|
|
|
|
|
void (*debug)(const char *fmt, ...);
|
|
|
|
|
utc_item_t *utc_tbl; /*utc <20><>*/
|
|
|
|
|
char *urc_buf; /*urc<72><63><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
unsigned short urc_tbl_count;
|
|
|
|
|
unsigned short urc_bufsize; /*urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С*/
|
|
|
|
|
}at_conf_t;
|
|
|
|
|
|
|
|
|
|
/*AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6> ---------------------------------------------------------------*/
|
|
|
|
|
typedef enum {
|
|
|
|
|
AT_RET_OK = 0, /*ִ<>гɹ<D0B3>*/
|
|
|
|
|
AT_RET_ERROR, /*ִ<>д<EFBFBD><D0B4><EFBFBD>*/
|
|
|
|
|
AT_RET_TIMEOUT, /*<2A><>Ӧ<EFBFBD><D3A6>ʱ*/
|
|
|
|
|
AT_RET_ABORT, /*δ֪<CEB4><D6AA><EFBFBD><EFBFBD>*/
|
|
|
|
|
}at_return;
|
|
|
|
|
|
|
|
|
|
/*AT<41><54>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> -----------------------------------------------------------------*/
|
|
|
|
|
typedef struct {
|
|
|
|
|
const char *matcher; /*<2A><><EFBFBD><EFBFBD>ƥ<EFBFBD>䴮*/
|
|
|
|
|
char *recvbuf; /*<2A><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
unsigned short bufsize; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճ<EFBFBD><D5B3><EFBFBD>*/
|
|
|
|
|
unsigned int timeout; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1> */
|
|
|
|
|
}at_respond_t;
|
|
|
|
|
|
|
|
|
|
/*AT<41><54>ҵ ---------------------------------------------------------------------*/
|
|
|
|
|
typedef struct at_work_env{
|
|
|
|
|
struct at_obj *at;
|
|
|
|
|
void *params;
|
|
|
|
|
unsigned int (*write)(const void *buf, unsigned int len);
|
|
|
|
|
unsigned int (*read)(void *buf, unsigned int len);
|
|
|
|
|
|
|
|
|
|
void (*printf)(struct at_obj *at, const char *frm, ...);
|
|
|
|
|
at_return (*wait_resp)(struct at_obj *at, const char *resp, unsigned int timeout);
|
|
|
|
|
void (*recvclr)(struct at_obj *at); /*<2A><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
}at_work_env_t;
|
|
|
|
|
|
|
|
|
|
/*AT<41><54><EFBFBD><EFBFBD> ---------------------------------------------------------------------*/
|
|
|
|
|
typedef struct at_obj {
|
|
|
|
|
struct list_head node;
|
|
|
|
|
at_conf_t cfg;
|
|
|
|
|
at_work_env_t env;
|
|
|
|
|
at_sem_t cmd_lock; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
at_sem_t completed; /*<2A><><EFBFBD><EFBFBD><EEB4A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
at_respond_t *resp;
|
|
|
|
|
unsigned int resp_timer;
|
|
|
|
|
unsigned int urc_timer;
|
|
|
|
|
at_return ret;
|
|
|
|
|
//urc<72><63><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
unsigned short urc_cnt, rcv_cnt;
|
|
|
|
|
unsigned char wait : 1;
|
|
|
|
|
unsigned char suspend: 1;
|
|
|
|
|
unsigned char dowork : 1;
|
|
|
|
|
}at_obj_t;
|
|
|
|
|
|
|
|
|
|
typedef int (*at_work)(at_work_env_t *);
|
|
|
|
|
|
|
|
|
|
void at_obj_create(at_obj_t *at, const at_conf_t cfg); /*AT<41><54>ʼ<EFBFBD><CABC>*/
|
|
|
|
|
|
|
|
|
|
void at_obj_destroy(at_obj_t *at);
|
|
|
|
|
|
|
|
|
|
bool at_obj_busy(at_obj_t *at);
|
|
|
|
|
|
|
|
|
|
void at_suspend(at_obj_t *at); /*<2A><><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
|
|
|
|
void at_resume(at_obj_t *at); /*<2A>ָ<EFBFBD>*/
|
|
|
|
|
|
|
|
|
|
at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd);
|
|
|
|
|
|
|
|
|
|
int at_split_respond_lines(char *recvbuf, char *lines[], int count);
|
|
|
|
|
|
|
|
|
|
int at_do_work(at_obj_t *at, at_work work, void *params); /*ִ<><D6B4>AT<41><54>ҵ*/
|
|
|
|
|
|
|
|
|
|
void at_thread(void); /*AT<41>߳<EFBFBD>*/
|
|
|
|
|
|
|
|
|
|
#endif
|