AT-Command/at_chat.h

148 lines
6.1 KiB
C
Raw Normal View History

2020-09-26 13:50:55 +00:00
/******************************************************************************
* @brief ATָ<EFBFBD><EFBFBD>ͨ<EFBFBD>Ź<EFBFBD><EFBFBD><EFBFBD>
2020-09-26 13:50:55 +00:00
*
* Copyright (c) 2020~2021, <morro_luo@163.com>
2020-09-26 13:50:55 +00:00
*
* SPDX-License-Identifier: Apathe-2.0
*
* Change Logs:
* Date Author Notes
* 2020-01-02 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 2021-01-20 Morro <EFBFBD><EFBFBD><EFBFBD><EFBFBD>debug<EFBFBD><EFBFBD><EFBFBD>Խӿ<EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>ͨ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚӿ<EFBFBD>
2020-09-26 13:50:55 +00:00
******************************************************************************/
2020-06-13 04:24:28 +00:00
#ifndef _ATCHAT_H_
#define _ATCHAT_H_
#include <list.h>
#include <stdbool.h>
/*<2A><><EFBFBD><EFBFBD>AT<41><54><EFBFBD><EFBFBD><EEB3A4> --------------------------------------------------------------*/
2020-06-13 04:24:28 +00:00
#define MAX_AT_CMD_LEN 128
/* debug <20><>ӡ<EFBFBD>ӿ<EFBFBD> ------------------------------------------------------------*/
#include <stdio.h>
#define AT_DEBUG(...) printf("[AT]:");printf(__VA_ARGS__) /*do{}while(0)*/
/* <20><>ȡϵͳ<CFB5>δ<EFBFBD>(ms) -----------------------------------------------------------*/
#include "platform.h"
#define AT_GET_TICK() get_tick()
2020-09-26 13:50:55 +00:00
struct at_obj;
2020-06-13 04:24:28 +00:00
/*urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -----------------------------------------------------------------*/
typedef struct {
const char *prefix; //<2F><>Ҫƥ<D2AA><C6A5><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>
void (*handler)(char *recvbuf, int size);
}utc_item_t;
/*AT<41>ӿ<EFBFBD><D3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---------------------------------------------------------------*/
2020-06-13 04:24:28 +00:00
typedef struct {
unsigned int (*write)(const void *buf, unsigned int len); /* <20><><EFBFBD>ͽӿ<CDBD>*/
unsigned int (*read)(void *buf, unsigned int len); /* <20><><EFBFBD>սӿ<D5BD>*/
void (*error)(void); /* ATִ<54><D6B4><EFBFBD><EFBFBD>¼<EFBFBD>*/
utc_item_t *utc_tbl; /* urc <20><>*/
unsigned char *urc_buf; /* urc<72><63><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>*/
unsigned char *recv_buf; /* <20><><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD>*/
unsigned short urc_tbl_count; /* urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
unsigned short urc_bufsize; /* urc<72><63><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С*/
unsigned short recv_bufsize; /* <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С*/
}at_adapter_t;
2020-06-13 04:24:28 +00:00
/*AT<41><54>ҵ<EFBFBD><D2B5><EFBFBD>л<EFBFBD><D0BB><EFBFBD>*/
typedef struct {
int i,j,state;
2020-09-22 14:14:09 +00:00
void *params;
void (*reset_timer)(struct at_obj *at);
2020-09-26 13:50:55 +00:00
bool (*is_timeout)(struct at_obj *at, unsigned int ms); /*ʱ<><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>*/
void (*printf)(struct at_obj *at, const char *fmt, ...);
char * (*find)(struct at_obj *at, const char *expect);
char * (*recvbuf)(struct at_obj *at); /* ָ<><D6B8><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>*/
unsigned int(*recvlen)(struct at_obj *at); /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳ<EFBFBD><DCB3><EFBFBD>*/
void (*recvclr)(struct at_obj *at); /* <20><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>*/
bool (*abort)(struct at_obj *at); /* <20><>ִֹ<D6B9><D6B4>*/
2020-06-13 04:24:28 +00:00
}at_env_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, /* <20><>Ӧ<EFBFBD><D3A6>ʱ*/
AT_RET_ABORT, /* ǿ<><C7BF><EFBFBD><EFBFBD>ֹ*/
2020-06-13 04:24:28 +00:00
}at_return;
/*AT<41><54>Ӧ */
typedef struct {
void *param;
char *recvbuf; /* <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>*/
unsigned short recvcnt; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>*/
at_return ret; /* ATִ<54>н<EFBFBD><D0BD><EFBFBD>*/
2020-06-13 04:24:28 +00:00
}at_response_t;
typedef void (*at_callbatk_t)(at_response_t *r); /* AT ִ<>лص<D0BB>*/
/*AT״̬ (<28><>ǰ<EFBFBD>汾δ<E6B1BE><CEB4>) ------------------------------------------------------*/
2020-06-13 04:24:28 +00:00
typedef enum {
AT_STATE_IDLE, /* <20><><EFBFBD><EFBFBD>״̬*/
AT_STATE_WAIT, /* <20>ȴ<EFBFBD>ִ<EFBFBD><D6B4>*/
AT_STATE_EXEC, /* <20><><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>*/
2020-06-13 04:24:28 +00:00
}at_work_state;
/*AT<41><54>ҵ<EFBFBD><D2B5>*/
typedef struct {
unsigned int state : 3;
unsigned int type : 3; /* <20><>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>*/
unsigned int abort : 1;
void *param; /* ͨ<>ò<EFBFBD><C3B2><EFBFBD>*/
void *info; /* ͨ<><CDA8><EFBFBD><EFBFBD>Ϣָ<CFA2><D6B8>*/
struct list_head node; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
2020-06-13 04:24:28 +00:00
}at_item_t;
/*AT<41><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ------------------------------------------------------------------*/
2020-09-26 13:50:55 +00:00
typedef struct at_obj{
at_adapter_t adap;
at_env_t env; /* <20><>ҵ<EFBFBD><D2B5><EFBFBD>л<EFBFBD><D0BB><EFBFBD>*/
at_item_t items[10]; /* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD>ҵ*/
at_item_t *cursor; /* <20><>ǰ<EFBFBD><C7B0>ҵ<EFBFBD><D2B5>*/
struct list_head ls_ready, ls_idle; /* <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>*/
unsigned int timer;
unsigned int urc_timer; /* urc<72><63><EFBFBD>ռ<EFBFBD>ʱ<EFBFBD><CAB1>*/
at_return ret;
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, recv_cnt;
2020-09-22 14:14:09 +00:00
unsigned char suspend: 1;
2020-09-26 13:50:55 +00:00
}at_obj_t;
2020-06-13 04:24:28 +00:00
typedef struct {
void (*sender)(at_env_t *e); /*<2A>Զ<EFBFBD><D4B6><EFBFBD><E5B7A2><EFBFBD><EFBFBD> */
const char *matcher; /*<2A><><EFBFBD><EFBFBD>ƥ<EFBFBD>䴮 */
2020-09-26 13:50:55 +00:00
at_callbatk_t cb; /*<2A><>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD> */
2020-06-13 04:24:28 +00:00
unsigned char retry; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD> */
unsigned short timeout; /*<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1> */
}at_cmd_t;
void at_obj_init(at_obj_t *at, const at_adapter_t *);
2020-06-13 04:24:28 +00:00
2020-09-26 13:50:55 +00:00
bool at_send_singlline(at_obj_t *at, at_callbatk_t cb, const char *singlline);
2020-09-26 13:50:55 +00:00
bool at_send_multiline(at_obj_t *at, at_callbatk_t cb, const char **multiline);
2020-09-26 13:50:55 +00:00
bool at_do_cmd(at_obj_t *at, void *params, const at_cmd_t *cmd);
2020-09-26 13:50:55 +00:00
bool at_do_work(at_obj_t *at, int (*work)(at_env_t *e), void *params);
2020-06-13 04:24:28 +00:00
2020-09-26 13:50:55 +00:00
void at_item_abort(at_item_t *it); /*<2A><>ֹ<EFBFBD><D6B9>ǰ<EFBFBD><C7B0>ҵ*/
bool at_obj_busy(at_obj_t *at); /*æ<>ж<EFBFBD>*/
2020-06-13 04:24:28 +00:00
2020-09-26 13:50:55 +00:00
void at_suspend(at_obj_t *at);
2020-06-13 04:24:28 +00:00
2020-09-26 13:50:55 +00:00
void at_resume(at_obj_t *at);
2020-06-13 04:24:28 +00:00
2020-09-26 13:50:55 +00:00
void at_poll_task(at_obj_t *at);
2020-06-13 04:24:28 +00:00
#endif