src.dualinventive.com/fw/libdi_fw-tests/libdi/include/di/drv/hl854x.h

247 lines
8.0 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @file di/drv/hl854x.h
* @defgroup hl854x HL854x 3G Modem
* Driver for Sierra Wireless HL854x modem using AT-Command interface
* @{
*/
#ifndef DI_DRV_HL854X_H_
#define DI_DRV_HL854X_H_
#include <stdint.h>
#include <stdbool.h>
#include <di/encoding/me.h>
#include <di/rpc/structures.h>
#ifdef __cplusplus
extern "C" {
#endif
struct di_drv_hl854x_ctx;
#include <di/drv/hl854x/me.h>
#include <di/drv/hl854x/str.h>
#include <di/drv/hl854x/tcp.h>
#include <di/drv/hl854x/error.h>
#include <di/drv/hl854x/cme_error.h>
/**
* AT-Command reply response
*/
enum di_drv_hl854x_reply {
HL854X_REPLY_TIMEOUT = -1,
HL854X_REPLY_UNKNOWN = 0,
HL854X_REPLY_NONBLOCK,
HL854X_REPLY_ABORTED,
HL854X_REPLY_CONNECT,
HL854X_REPLY_OK,
HL854X_REPLY_ERROR,
HL854X_REPLY_SUCCESS,
HL854X_REPLY_NO_CARRIER,
HL854X_REPLY_EOF
};
/** Carrier registration status */
enum di_drv_hl854x_carrier_status {
HL854X_CARRIER_STATUS_NOT_REG = 0, /**< Not registered, ME is not currently
* searching a new operator to register to
*/
HL854X_CARRIER_STATUS_REG_HOME = 1, /**< Registered, home network */
HL854X_CARRIER_STATUS_NOT_REG_SEARCH = 2, /**< Not registered, but ME is currently
* searching a new operator to register to
*/
HL854X_CARRIER_STATUS_REG_DENIED = 3, /**< Registration denied */
HL854X_CARRIER_STATUS_UNKNOWN = 4, /**< Unknown */
HL854X_CARRIER_STATUS_REG_ROAMING = 5, /**< Registered, roaming */
HL854X_CARRIER_STATUS_REQUESTED = 6 /**< Requested carrier status */
};
/** Carrier access technology */
enum di_drv_hl854x_carrier_act {
HL854X_CARRIER_ACT_GSM = 0, /** GSM */
HL854X_CARRIER_ACT_UMTS = 2, /** UMTS */
};
/** Sim status */
enum di_drv_hl854x_sim_status {
HL854X_SIM_STATUS_UNKNOWN = 0, /**< SIM status unknown */
HL854X_SIM_STATUS_READY = 1, /**< SIM ready */
HL854X_SIM_STATUS_SIM_PIN = 2, /**< SIM pin pending */
HL854X_SIM_STATUS_SIM_PUK = 3, /**< SIM puk pending */
HL854X_SIM_STATUS_SELECTED = 127, /**< SIM selected */
HL854X_SIM_STATUS_ERROR = 128 /**< SIM error */
};
/** Sleep modes */
enum di_drv_hl854x_sleep_mode {
HL854X_SLEEP_MODE_0 = 0, /**< The module doesnt go in sleep mode as long as DTR is active (low level) */
HL854X_SLEEP_MODE_1 = 1, /**< The module decides by itself (internal timing) */
HL854X_SLEEP_MODE_2 = 2 /**< Never go to sleep (default) */
};
/** Connection state */
enum di_drv_hl854x_con_state {
HL854X_CON_STATE_UNKNOWN = 0,
HL854X_CON_STATE_WRITTEN = 1,
HL854X_CON_STATE_DEFINED = 2,
HL854X_CON_STATE_CLOSED = 3,
HL854X_CON_STATE_CONNECTED = 4,
HL854X_CON_STATE_CONNECTING = 5
};
enum di_drv_hl854x_gps_state {
HL854X_GPS_STATE_UNINIT = 0,
HL854X_GPS_STATE_INITIALIZED = 1,
HL854X_GPS_STATE_START = 3,
HL854X_GPS_STATE_SLEEP = 4,
HL854X_GPS_STATE_STOP = 5
};
enum di_drv_hl854x_baudrate {
HL854X_BAUDRATE_115K2 = 115200,
HL854X_BAUDRATE_500K0 = 500000,
HL854X_BAUDRATE_921K6 = 921600
};
#define HL854X_BAUDRATE_FACTORY HL854X_BAUDRATE_115K2 /**< Factory default baudrate */
struct di_drv_hl854x_gps {
uint8_t state; /**< State of GPS chipset @see di_drv_hl854x_gps_state */
bool time_shot_enabled; /**< Enables time sync shot on next PVT time frame */
struct {
uint8_t tm_sec; /**< Seconds after the minute, range 0-59 */
uint8_t tm_min; /**< Minutes after the hour, range 0-59 */
uint8_t tm_hour; /**< Hours since midnight, range 0-23 */
uint8_t tm_mday; /**< Day of the month, range 1-31 */
uint8_t tm_mon; /**< Months since January, range 0-11 */
uint16_t tm_year; /**< Current year, e.g 2015 */
uint32_t unix; /**< UNIX time since epoch, in second granularity */
} time;
struct di_rpc_sensor_data_gps data;
};
struct di_drv_hl854x_ctx_tcp {
int8_t state; /**< State @see di_drv_hl854x_tcp_state */
uint64_t tx_bytes; /**< Amount of bytes send with di_drv_hl854x_tcp_send */
uint64_t rx_bytes; /**< Amount of bytes send with di_drv_hl854x_tcp_recv */
char remote_addr[32]; /**< Remote address. E.g "beta.dualinventive.com" */
char remote_port[6]; /**< Remote port. E.g "3003" */
size_t recv_size; /**< Amount of bytes in receive buffer */
size_t cc_size;
void *cc_data;
};
/**
* HL854X driver
*/
struct di_drv_hl854x_ctx {
uint8_t linebuffer[256]; /**< Linebuffer for matching engine */
uint8_t readbuffer[256]; /**< Reader for serial driver */
enum di_drv_hl854x_reply reply; /**< Last reply status @see di_drv_hl854x_reply */
enum di_drv_hl854x_error error; /**< Last error report @see di_drv_hl854x_error */
enum di_drv_hl854x_cme_error cme_error; /**< CME Error code @see di_drv_hl854x_cme_error_codes */
enum di_drv_hl854x_ktcp_notif ktcp_notif; /**< KTCP_NOTIF */
struct modem {
char revision[128]; /**< Identification Information */
char imei[16]; /**< 15 digits IMEI (8 digits for TAC + 6 digits for SNR + 1 check digit) */
} modem;
struct sim {
uint8_t status; /**< Status of SIM @see di_drv_hl854x_sim_status */
char ccid[23]; /**< Integrated Circuit Card ID of the SIM card */
char imsi[20]; /**< IMSI of the SIM card */
} sim;
struct carrier {
uint8_t status; /**< GPRS carrier status, see @see di_drv_hl854x_carrier_status */
char operator_name[17]; /**< Operator name string */
uint8_t act; /**< Access technology @see di_drv_hl854x_carrier_act */
int8_t rssi; /**< RSSI quality */
int8_t ber; /**< Bit error rate */
} carrier;
struct di_drv_hl854x_gps gps;
struct con {
int8_t state; /**< State @see di_drv_hl854x_con_state */
} con;
struct di_drv_hl854x_ctx_tcp tcp;
/* Private */
struct di_me_ctx me; /**< HL854x driver matching engine context */
enum di_me_item_states me_items_state[DI_DRV_HL854X_ME_ITEMS_SIZE];
struct lock {
di_bsem_t ctx;
di_bsem_t reader;
} lock;
/* Timeouts */
struct timeout {
uint32_t read;
uint32_t cmd;
} timeout;
/* Callbacks */
size_t (*read)(void *buf, size_t n);
size_t (*write)(const void *buf, size_t n);
struct cb {
di_drv_hl854x_error_cb_t error;
di_drv_hl854x_cme_error_cb_t cme_error;
} cb;
};
/**
* HL854x initialize context
* - Resets ALL fields in ctx
*/
void di_drv_hl854x_init(struct di_drv_hl854x_ctx *ctx);
static inline void di_drv_hl854x_set_read(struct di_drv_hl854x_ctx *ctx, size_t (*read)(void *buf, size_t n))
{
ctx->read = read;
}
void di_drv_hl854x_set_read_timeout_ms(struct di_drv_hl854x_ctx *ctx, uint32_t timeout);
static inline void di_drv_hl854x_set_write(struct di_drv_hl854x_ctx *ctx, size_t (*write)(const void *buf, size_t n))
{
ctx->write = write;
}
void di_drv_hl854x_set_cmd_timeout_ms(struct di_drv_hl854x_ctx *ctx, uint32_t timeout);
/**
* HL854x feed data
*/
size_t di_drv_hl854x_read(struct di_drv_hl854x_ctx *ctx);
/**
* Send command to hl854x
*/
void di_drv_hl854x_cmd(struct di_drv_hl854x_ctx *ctx, const char *s, uint8_t reply);
void di_drv_hl854x_cmd_nolock(struct di_drv_hl854x_ctx *ctx, const char *s, uint8_t reply);
void di_drv_hl854x_write_wait(struct di_drv_hl854x_ctx *ctx, const char *s, uint8_t reply, bool newline);
void di_drv_hl854x_write_wait_nolock(struct di_drv_hl854x_ctx *ctx, const char *s, uint8_t reply, bool newline);
void di_drv_hl854x_req_modem_revision(struct di_drv_hl854x_ctx *ctx);
void di_drv_hl854x_req_sim_imsi(struct di_drv_hl854x_ctx *ctx);
void di_drv_hl854x_net_req_rssi(struct di_drv_hl854x_ctx *ctx);
/* Wrapped commands */
void di_drv_hl854x_disable_echo(struct di_drv_hl854x_ctx *ctx);
void di_drv_hl854x_set_baudrate(struct di_drv_hl854x_ctx *ctx, enum di_drv_hl854x_baudrate baudrate);
void di_drv_hl854x_req_imeisv(struct di_drv_hl854x_ctx *ctx);
void di_drv_hl854x_set_sleep_mode(struct di_drv_hl854x_ctx *ctx, enum di_drv_hl854x_sleep_mode s);
/**
*/
void di_drv_hl854x_gps_start(struct di_drv_hl854x_ctx *ctx);
void di_drv_hl854x_gps_sleep(struct di_drv_hl854x_ctx *ctx);
void di_drv_hl854x_gps_stop(struct di_drv_hl854x_ctx *ctx);
void di_drv_hl854x_con_cfg(struct di_drv_hl854x_ctx *ctx);
#ifdef __cplusplus
}
#endif
/** @} */
#endif /* DI_DRV_HL854X_H__ */