FreeCalypso > hg > fc-tourmaline
diff src/g23m-aci/aci/ati_src_rvt.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-aci/aci/ati_src_rvt.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,194 @@ +/* + * This module is a FreeCalypso addition. Here we are going to implement + * a mechanism for passing AT commands and responses over RVTMUX. + */ + +/* includes copied from ati_cmd.c */ + +#undef DUMMY_ATI_STRINGS + +#include "aci_all.h" + +#include "dti.h" /* functionality of the dti library */ +#include "line_edit.h" /* SKA 2002-09-05 */ +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_io.h" +#include "aci_cmd.h" +#include "l4_tim.h" + +#include <string.h> +#include <stdarg.h> +#include <stdio.h> + +#include "psa.h" +#include "cmh.h" + +#include "aci_lst.h" +#include "dti_conn_mng.h" +#ifdef UART +#include "psa_uart.h" +#endif +#include "ati_io.h" +#include "aci_mem.h" + +#ifdef SIM_TOOLKIT +#include "ati_src_sat.h" +#include "psa_cc.h" +#include "psa_sat.h" +#endif /* SIM_TOOLKIT */ + +#ifdef GPRS +#include "gaci_cmh.h" +#include "gaci_cmd.h" +#endif /* GPRS */ + +#include "aci_prs.h" + + +#ifndef _SIMULATION_ +#ifdef UART +#include "cmh_uart.h" +#endif +#endif + +#include "psa_sms.h" +#include "aci.h" +#include "ati_ext_mech.h" + +#ifdef FF_ATI_BAT +#include "ati_bat.h" +#include "aci_bat.h" +#endif + +EXTERN T_ACI_LIST *ati_src_list; + +#include "rvt/rvt_gen.h" + +static UBYTE rvt_src_id; +static T_RVT_USER_ID rvt_user_id; + +/* + * The following function is the callback registered with RVT; it gets + * called in RVT HISR context. We allocate an ACI_CMD_REQ primitive, + * copy the received string into it and post it to ACI to be processed + * in our own task context. + */ +GLOBAL void ati_src_rvt_input_callback (T_RVT_BUFFER in_str, UINT16 in_str_len) +{ + PALLOC (aci_cmd_req, ACI_CMD_REQ); + + aci_cmd_req->cmd_src = rvt_src_id; + aci_cmd_req->cmd_len = in_str_len; + memcpy(aci_cmd_req->cmd_seq, in_str, in_str_len); + + PSENDX (ACI, aci_cmd_req); +} + +/* + * The following function is called from aci_aci.c when an ACI_CMD_REQ + * primitive (sent by the previous function) has been received. + */ +GLOBAL BOOL ati_src_rvt_proc_cmd (T_ACI_CMD_REQ *aci_cmd_req) +{ + T_ATI_SRC_PARAMS *src_params = find_element (ati_src_list, rvt_src_id, + search_ati_src_id); + USHORT offset; + + ati_user_output_cfg[rvt_src_id].atE = 0; + + if (aci_cmd_req->cmd_len && aci_cmd_req->cmd_seq[0] == 0x01) + { + TRACE_FUNCTION ("ati_src_rvt_proc_cmd () unterminated"); + + aci_cmd_req->cmd_seq[aci_cmd_req->cmd_len] = '\0'; + offset = 1; + } + else + { + offset = 0; + if (src_params->text_mode EQ CMD_MODE) + { + TRACE_FUNCTION ("ati_src_rvt_proc_cmd () CMD MODE"); + + aci_cmd_req->cmd_seq[aci_cmd_req->cmd_len] = '\r'; /* make it V.25 ter compatible */ + aci_cmd_req->cmd_seq[(aci_cmd_req->cmd_len) + 1] = '\0'; + aci_cmd_req->cmd_len++; + } + else /* text has to be terminated by Ctrl-Z */ + { + TRACE_FUNCTION ("ati_src_rvt_proc_cmd () TEXT MODE"); + + aci_cmd_req->cmd_seq[aci_cmd_req->cmd_len] = 0x1a; /* make it V.25 ter compatible */ + aci_cmd_req->cmd_seq[(aci_cmd_req->cmd_len) + 1] = '\0'; + aci_cmd_req->cmd_len++; + } + } + + return (ati_execute (rvt_src_id, + aci_cmd_req->cmd_seq + offset, + aci_cmd_req->cmd_len - offset)); +} + +/* + * The following function is the callback registered with ATI; it gets + * called when ATI has something to send to the user. + */ +GLOBAL void ati_src_rvt_result_cb (UBYTE src_id, + T_ATI_OUTPUT_TYPE output_type, + UBYTE *output, + USHORT output_len) +{ + TRACE_FUNCTION ("ati_src_rvt_result_cb ()"); + rvt_send_trace_cpy (output, rvt_user_id, output_len, RVT_ASCII_FORMAT); +} + +/* + * The following function is the other callback registered with ATI. + */ +GLOBAL void ati_src_rvt_line_state_cb (UBYTE src_id, + T_ATI_LINE_STATE_TYPE line_state_type, + ULONG line_state_param) +{ + TRACE_FUNCTION ("ati_src_rvt_line_state_cb ()"); + + switch (line_state_type) + { + case ATI_LINE_STATE_OUTPUT_TYPE: + TRACE_EVENT_P1 ("[DBG] ati_src_rvt_line_state_cb (): ATI_LINE_STATE_OUTPUT_TYPE = %d", line_state_param); + break; + + case ATI_LINE_STATE_DCD: + TRACE_EVENT_P1 ("[DBG] ati_src_rvt_line_state_cb (): ATI_LINE_STATE_DCD = %d", line_state_param); + break; + + case ATI_LINE_STATE_RNG: /* TODO */ + { + T_IO_RING_PARAMS rng_params; + + memcpy (&rng_params, (T_IO_RING_PARAMS*)line_state_param, + sizeof(T_IO_RING_PARAMS)); + + TRACE_EVENT_P1 ("[DBG] ati_src_rvt_line_state_cb (): ATI_LINE_STATE_RNG = %d", rng_params.ring_stat); + + break; + } + + default: + TRACE_EVENT_P1 ("[WRN] ati_src_rvt_line_state_cb (): UNKNOWN line_state_type = %d", line_state_type); + break; + } +} + +/* + * The following function is called from ati_cmd_init() in ati_cmd.c + * to register our mechanism. + */ +GLOBAL void ati_src_rvt_register (void) +{ + rvt_register_id ("AT", &rvt_user_id, ati_src_rvt_input_callback); + rvt_src_id = ati_init (ATI_SRC_TYPE_TST, + ati_src_rvt_result_cb, + ati_src_rvt_line_state_cb); + ati_switch_mode(rvt_src_id, ATI_CMD_MODE); +}