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.
|
2021-02-19 14:21:05 +00:00
|
|
|
|
* 2021-02-01 Morro ֧<EFBFBD><EFBFBD>URC<EFBFBD>ص<EFBFBD><EFBFBD>н<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|
|
|
|
* 2021-02-05 Morro 1.<EFBFBD><EFBFBD>struct at_obj,ȥ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* 2.ɾ<EFBFBD><EFBFBD> at_obj_destroy<EFBFBD>ӿ<EFBFBD>
|
2020-09-26 13:50:55 +00:00
|
|
|
|
******************************************************************************/
|
2021-01-05 14:31:48 +00:00
|
|
|
|
|
2020-09-22 14:14:09 +00:00
|
|
|
|
#ifndef _AT_H_
|
|
|
|
|
#define _AT_H_
|
|
|
|
|
|
|
|
|
|
#include "at_util.h"
|
|
|
|
|
#include <stdbool.h>
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EEB3A4> */
|
2021-01-05 14:31:48 +00:00
|
|
|
|
#define MAX_AT_CMD_LEN 128
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
/* <20><><EFBFBD><EFBFBD>urc<72><63><EFBFBD>ճ<EFBFBD>ʱʱ<CAB1><CAB1>*/
|
|
|
|
|
#define MAX_URC_RECV_TIMEOUT 300
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
/* ָ<><D6B8><EFBFBD><EFBFBD>URC <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD> */
|
|
|
|
|
#define SPEC_URC_END_MARKS ",\r\n"
|
|
|
|
|
|
|
|
|
|
struct at_obj; /* AT<41><54><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
|
|
|
|
/*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, /* <20><>Ӧ<EFBFBD><D3A6>ʱ*/
|
|
|
|
|
AT_RET_ABORT, /* δ֪<CEB4><D6AA><EFBFBD><EFBFBD>*/
|
|
|
|
|
}at_return;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief URC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Context) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
typedef struct {
|
2021-02-19 14:21:05 +00:00
|
|
|
|
/**
|
|
|
|
|
* @brief <EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD>ӿ<EFBFBD>
|
|
|
|
|
* @params buf - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @params len - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
|
|
|
|
|
*/
|
|
|
|
|
unsigned int (*read)(void *buf, unsigned int len);
|
|
|
|
|
char *buf; /* <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
int bufsize; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С */
|
|
|
|
|
int recvlen; /* <20>ѽ<EFBFBD><D1BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>*/
|
|
|
|
|
} at_urc_ctx_t;
|
|
|
|
|
|
|
|
|
|
/*(Unsolicited Result Codes (URCs))<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------------------------*/
|
|
|
|
|
typedef struct {
|
|
|
|
|
/**
|
|
|
|
|
* @brief urc ǰ(<EFBFBD><EFBFBD>"+CSQ: ")
|
|
|
|
|
*/
|
|
|
|
|
const char *prefix;
|
|
|
|
|
/**
|
|
|
|
|
* @brief urc ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD>ο<EFBFBD>DEF_URC_END_MARKS<EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><EFBFBD>"\n")
|
|
|
|
|
* @note
|
|
|
|
|
*/
|
|
|
|
|
const char *end_mark;
|
|
|
|
|
/**
|
|
|
|
|
* @brief urc<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
* @params ctx - URC <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
void (*handler)(at_urc_ctx_t *ctx);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}utc_item_t;
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
/**AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> --------------------------------------------------------------*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
typedef struct {
|
2021-02-19 14:21:05 +00:00
|
|
|
|
//<2F><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>
|
2020-09-22 14:14:09 +00:00
|
|
|
|
unsigned int (*write)(const void *buf, unsigned int len);
|
2021-02-19 14:21:05 +00:00
|
|
|
|
//<2F><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
unsigned int (*read)(void *buf, unsigned int len);
|
|
|
|
|
//<2F><><EFBFBD>Դ<EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
|
|
|
|
void (*debug)(const char *fmt, ...);
|
|
|
|
|
//utc <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
|
|
|
|
utc_item_t *utc_tbl;
|
|
|
|
|
//urc<72><63><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>NULL
|
|
|
|
|
char *urc_buf;
|
|
|
|
|
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
|
|
|
|
|
unsigned short urc_tbl_count;
|
|
|
|
|
//urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>0
|
|
|
|
|
unsigned short urc_bufsize;
|
2021-01-05 14:31:48 +00:00
|
|
|
|
}at_adapter_t;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
|
|
|
|
/*AT<41><54>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> -----------------------------------------------------------------*/
|
|
|
|
|
typedef struct {
|
2021-02-19 14:21:05 +00:00
|
|
|
|
const char *matcher; /* <20><><EFBFBD><EFBFBD>ƥ<EFBFBD>䴮 */
|
|
|
|
|
char *recvbuf; /* <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
unsigned short bufsize; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
unsigned int timeout; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1> */
|
2020-09-22 14:14:09 +00:00
|
|
|
|
}at_respond_t;
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
/** work context ------------------------------------------------------------*/
|
|
|
|
|
/**
|
|
|
|
|
* @brief AT<EFBFBD><EFBFBD>ҵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(Work Context) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
*/
|
|
|
|
|
typedef struct at_work_ctx {
|
|
|
|
|
//<2F><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>,<2C><>at_do_work<72>ӿڴ<D3BF><DAB4><EFBFBD>
|
2020-09-22 14:14:09 +00:00
|
|
|
|
void *params;
|
|
|
|
|
unsigned int (*write)(const void *buf, unsigned int len);
|
|
|
|
|
unsigned int (*read)(void *buf, unsigned int len);
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
//<2F><>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD>
|
|
|
|
|
void (*printf)(struct at_work_ctx *self, const char *fmt, ...);
|
|
|
|
|
//<2F><>Ӧ<EFBFBD>ȴ<EFBFBD>
|
|
|
|
|
at_return (*wait_resp)(struct at_work_ctx *self, const char *prefix,
|
|
|
|
|
unsigned int timeout);
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD>
|
|
|
|
|
void (*recvclr)(struct at_work_ctx *self);
|
|
|
|
|
}at_work_ctx_t;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
|
|
|
|
/*AT<41><54><EFBFBD><EFBFBD> ---------------------------------------------------------------------*/
|
|
|
|
|
typedef struct at_obj {
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at_adapter_t adap; /* <20>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
at_work_ctx_t ctx; /* work context*/
|
|
|
|
|
at_sem_t cmd_lock; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
at_sem_t completed; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>*/
|
|
|
|
|
at_respond_t *resp; /* ATӦ<54><D3A6><EFBFBD><EFBFBD>Ϣ*/
|
|
|
|
|
unsigned int resp_timer; /* <20><>Ӧ<EFBFBD><D3A6><EFBFBD>ն<EFBFBD>ʱ<EFBFBD><CAB1>*/
|
|
|
|
|
unsigned int urc_timer; /* URC<52><43>ʱ<EFBFBD><CAB1> */
|
|
|
|
|
at_return ret; /* <20><><EFBFBD><EFBFBD>ִ<EFBFBD>н<EFBFBD><D0BD><EFBFBD>*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
//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;
|
2021-02-19 14:21:05 +00:00
|
|
|
|
unsigned char busy : 1;
|
2020-09-22 14:14:09 +00:00
|
|
|
|
unsigned char suspend: 1;
|
|
|
|
|
unsigned char dowork : 1;
|
|
|
|
|
}at_obj_t;
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
typedef at_return (*at_work)(at_work_ctx_t *);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
void at_obj_create(at_obj_t *at, const at_adapter_t *adap); /* AT<41><54>ʼ<EFBFBD><CABC>*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
|
|
|
|
void at_obj_destroy(at_obj_t *at);
|
|
|
|
|
|
|
|
|
|
bool at_obj_busy(at_obj_t *at);
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
void at_suspend(at_obj_t *at); /* <20><><EFBFBD><EFBFBD>*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
void at_resume(at_obj_t *at); /* <20>ָ<EFBFBD>*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
|
|
|
|
at_return at_do_cmd(at_obj_t *at, at_respond_t *r, const char *cmd);
|
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
//<2F><>Ӧ<EFBFBD>зָ<D6B8><EEB4A6>
|
2021-01-05 14:31:48 +00:00
|
|
|
|
int at_split_respond_lines(char *recvbuf, char *lines[], int count, char separator);
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
at_return at_do_work(at_obj_t *at, at_work work, void *params);/* <20>Զ<EFBFBD><D4B6><EFBFBD>AT<41><54>ҵ*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
2021-02-19 14:21:05 +00:00
|
|
|
|
void at_process(at_obj_t *at); /* AT<41><54><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>*/
|
2020-09-22 14:14:09 +00:00
|
|
|
|
|
|
|
|
|
#endif
|