FreeCalypso > hg > fc-tourmaline
diff src/g23m-aci/aci/ati_dti.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_dti.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,537 @@ +/* ++--------------------------------------------------------------------+ +| PROJECT: GSM-F&D (8411) $Workfile:: ati_dti.c $| +| $Author:: Rm $Revision:: 187 $| +| CREATED: 13.11.02 $Modtime:: $| +| STATE : code | ++--------------------------------------------------------------------+ + + MODULE : ATI + + PURPOSE : AT Command to control data flow and devices in addition with DTI + managment +*/ + +#ifdef DTI + +#ifndef ATI_DTI_C +#define ATI_DTI_C + +#include "aci_all.h" + +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "aci_io.h" +#include "aci_cmd.h" +#include "dti.h" /* functionality of the dti library */ +#include "aci_lst.h" +#include "ati_int.h" +#include "aci_mem.h" +#include "cmh_dti.h" +#include "dti_conn_mng.h" +#include "dti_cntrl_mng.h" + +#ifdef GPRS +#include "gaci_cmh.h" +#endif + +#ifdef FF_ATI_BAT + +#include "typedefs.h" +#include "gdd.h" +#include "bat.h" + +#include "ati_bat.h" + +#endif /* FF_ATI_BAT */ +/*==== EXPORT ==================================================*/ +EXTERN CHAR *cmdCmeError ( T_ACI_CMS_ERR e ); +EXTERN CHAR *parse(CHAR *b,CHAR *f, ...); + +/*==== VARIABLE====================================================*/ + +const T_CAP_NAME ati_cap_name[] = +{ + {"CMD", DEV_CPBLTY_CMD }, + {"SER", DEV_CPBLTY_SER }, + {"PKT", DEV_CPBLTY_PKT }, + {"CMD,SER", DEV_CPBLTY_CMD_SER }, + {"CMD,PKT", DEV_CPBLTY_CMD_PKT }, + {"PKT,SER", DEV_CPBLTY_PKT_SER }, + {"CMD,PKT,SER", DEV_CPBLTY_CMD_PKT_SER}, + {"", DEV_CPBLTY_NONE} +}; + +/*==== CONSTANT====================================================*/ + +#define DIO_DEVNO_MASK 0xFF + +/*==============================================================*/ + + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : | +| STATE : code ROUTINE : map_dti_cpblty | ++--------------------------------------------------------------------+ + + PURPOSE : help function to map the capability values of + DTI_CPBLTY_xxx to enum value of T_CAP_ID. + With the enum value we get the capability string in ati_cap_name[] + For DTI_CPBLTY_xxx see SAP document AAA.doc chapter Capability + Dor T_CAP_ID see cmh_dti.h +*/ +GLOBAL T_CAP_ID map_dti_cpblty (UBYTE dti_cpblty) +{ + switch (dti_cpblty) + { + case (DTI_CPBLTY_NO): + return (DEV_CPBLTY_NONE); + + case (DTI_CPBLTY_CMD): + return (DEV_CPBLTY_CMD); + + case (DTI_CPBLTY_SER): + return (DEV_CPBLTY_SER); + + case (DTI_CPBLTY_PKT): + return (DEV_CPBLTY_PKT); + + case (DTI_CPBLTY_CMD + DTI_CPBLTY_SER): + return (DEV_CPBLTY_CMD_SER); + + case (DTI_CPBLTY_CMD + DTI_CPBLTY_PKT): + return (DEV_CPBLTY_CMD_PKT); + + case (DTI_CPBLTY_PKT + DTI_CPBLTY_SER): + return (DEV_CPBLTY_PKT_SER); + + case (DTI_CPBLTY_CMD + DTI_CPBLTY_PKT + DTI_CPBLTY_SER): + return (DEV_CPBLTY_CMD_PKT_SER); + + default: + { + TRACE_EVENT_P1("map_dti_cpblty():[ERR] unknown capability value = %d",dti_cpblty); + return (DEV_CPBLTY_NONE); + } + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : | +| STATE : code ROUTINE : setatPercentDATA | ++--------------------------------------------------------------------+ + + PURPOSE : set %DATA command ( control data flow ) + format: + %DATA=<mode>,<des_dev_name>,<des_dev_no>,[<sub_no>],<cap>[,<src_dev_name>,<src_dev_no>,[<sub_no>],[,<cid>]] + example: + %DATA=2,"RIV",1,,"PKT","SNDCP",1,,, + means, set a permanent(2) redirection for "RIV" with packet capability to "SNDCP" +*/ + +GLOBAL T_ATI_RSLT setatPercentDATA ( char *cl, UBYTE srcId ) + +{ + CHAR des_dev_name[MAX_SMS_ADDR_DIG]; /* destination device name */ + CHAR src_dev_name[MAX_SMS_ADDR_DIG]; /* source device name */ + CHAR dev_cap[MAX_SMS_ADDR_DIG]; /* device capability */ + UBYTE red_mode = NOT_PRESENT_8BIT; /* redirection mode */ + UBYTE pdp_cid = NOT_PRESENT_8BIT; /* context cid */ + U32 des_devId = NOT_PRESENT_32BIT; /* destination device identifier */ + SHORT des_sub_no = ACI_NumParmNotPresent; /* destination sub number */ + U32 src_devId = NOT_PRESENT_32BIT; /* source device identifier */ + SHORT src_sub_no = ACI_NumParmNotPresent; /* source sub number */ + T_ACI_RETURN ret = AT_FAIL; + + src_dev_name[0]='\0'; + des_dev_name[0]='\0'; + + /* parse mode,des_dev_name, des_dev_no, cap, src_dev_name, src_dev_no, cid */ + cl = parse (cl, "xsyrssyrx", &red_mode, + (LONG)MAX_SMS_ADDR_DIG, + des_dev_name, &des_devId, &des_sub_no, + (LONG)MAX_SMS_ADDR_DIG, + dev_cap, + (LONG)MAX_SMS_ADDR_DIG, + src_dev_name, &src_devId, &src_sub_no, + &pdp_cid ); + if (!cl) + { + cmdCmeError (CME_ERR_Unknown); + return (ATI_FAIL); + } + + /* + + * if optional parameters have not been given, set to defaults + */ + if (des_sub_no EQ ACI_NumParmNotPresent) + { + des_sub_no = 0; + } + if (src_sub_no EQ ACI_NumParmNotPresent) + { + src_sub_no = 0; + } + if (pdp_cid EQ NOT_PRESENT_8BIT) + { + pdp_cid = 0; + } + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_percent_data my_bat_set_percent_data; + + TRACE_FUNCTION("setatPercentDATA() calls bat_send() <=== as APPLICATION"); + + memset(&my_bat_set_percent_data, 0, sizeof(my_bat_set_percent_data)); + cmd.ctrl_params = BAT_CMD_SET_PERCENT_DATA; + cmd.params.ptr_set_percent_data = &my_bat_set_percent_data; + + my_bat_set_percent_data.mode = red_mode; + + if (!strcmp(des_dev_name, "UART")) + my_bat_set_percent_data.des_dev_name = BAT_DEV_NAME_UART; + else if (!strcmp(des_dev_name, "RIV")) + my_bat_set_percent_data.des_dev_name = BAT_DEV_NAME_RIV; + else if (!strcmp(des_dev_name, "PKTIO")) + my_bat_set_percent_data.des_dev_name = BAT_DEV_NAME_PKTIO; + else if (!strcmp(des_dev_name, "PSI")) + my_bat_set_percent_data.des_dev_name = BAT_DEV_NAME_PSI; + + my_bat_set_percent_data.des_devId = des_devId; + my_bat_set_percent_data.des_sub_no = des_sub_no; + + if (!strcmp(dev_cap, "CMD")) + my_bat_set_percent_data.capability = BAT_CAP_CMD; + else if (!strcmp(dev_cap, "SER")) + my_bat_set_percent_data.capability = BAT_CAP_SER; + else if(!strcmp(dev_cap, "PKT")) + my_bat_set_percent_data.capability = BAT_CAP_PKT; + + if (!strcmp(des_dev_name, "UART")) + my_bat_set_percent_data.src_dev_name = BAT_DEV_NAME_UART; + else if (!strcmp(src_dev_name, "RIV")) + my_bat_set_percent_data.src_dev_name = BAT_DEV_NAME_RIV; + else if (!strcmp(src_dev_name, "PKTIO")) + my_bat_set_percent_data.src_dev_name = BAT_DEV_NAME_PKTIO; + else if (!strcmp(src_dev_name, "PSI")) + my_bat_set_percent_data.src_dev_name = BAT_DEV_NAME_PSI; + + my_bat_set_percent_data.src_devId = des_devId; + my_bat_set_percent_data.src_sub_no = src_sub_no; + my_bat_set_percent_data.cid = pdp_cid; + + bat_send(ati_bat_get_client(srcId), &cmd); + + return ATI_EXCT; /* executing, because response is passed by callback function */ + } +#else /* OLD FUNCTION BODY */ + + TRACE_FUNCTION( "setatPercentDATA()" ); + + ret = sAT_PercentDATA ((T_ACI_CMD_SRC)srcId, red_mode, + des_dev_name,(UBYTE)(des_devId&DIO_DEVNO_MASK),(UBYTE)des_sub_no, + dev_cap,src_dev_name,(UBYTE)(src_devId&DIO_DEVNO_MASK), + (UBYTE)src_sub_no,pdp_cid); + + if (ret EQ AT_FAIL) + { + cmdCmeError (CME_ERR_Unknown); + return (ATI_FAIL); + } + else + { + return (map_aci_2_ati_rslt(ret)); + } + +#endif /* no FF_ATI_BAT*/ +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : | +| STATE : code ROUTINE : queatPercentDATA| ++--------------------------------------------------------------------+ + + PURPOSE : query %DATA command ( control data flow ) +*/ + +GLOBAL T_ATI_RSLT queatPercentDATA ( char *cl, UBYTE srcId ) +{ + UBYTE mode = (UBYTE)-1; /* mode is UBYTE type so typecasting -1 with UBYTE */ + UBYTE cid = (UBYTE)-1; /* cid is UBYTE type so typecasting -1 with UBYTE */ + T_DINF_PARAM des_param; /* des_dev_name, des_dev_no, des_sub_no, des_cap */ + T_DINF_PARAM src_param; /* src_dev_name, src_dev_no, src_sub_no, pdp_cid */ + T_CAP_ID capability = DEV_CPBLTY_NONE; + +#ifdef GPRS + char *pktioName = "PKTIO"; +#endif /* GPRS */ + + TRACE_FUNCTION( "queatPercentDATA()" ); + + des_param.dev_id = NOT_PRESENT_8BIT; /* in case of there is no redirection at all */ + des_param.capability = 0xAA; /* init with a value which makes never sense */ + /* + * we want to get the pieces of information to all redirected devices + */ + while ((qAT_PercentDATA ((T_ACI_CMD_SRC)srcId, &mode, &cid, &des_param, &src_param)) EQ AT_CMPL) + { + U32 des_devId = NOT_PRESENT_32BIT; + U32 src_devId = NOT_PRESENT_32BIT; + char *tmp_des_name = dti_entity_name[des_param.dev_id].name; + char *tmp_src_name = dti_entity_name[src_param.dev_id].name; + capability = map_dti_cpblty (des_param.capability); + /* With the device number, driver number and the dio id, form + the device identifier of both the source and destination to + present to the terminal */ + + des_devId = (((U32)des_param.dev_no ) + |((U32) (des_param.driver_id<<24)) + |((U32) (des_param.dio_ctrl_id <<8))); + + src_devId = (((U32)src_param.dev_no ) + |((U32) (src_param.driver_id <<24)) + |((U32) (src_param.dio_ctrl_id <<8))); + + + /* + * unfortunately in custom.h for PKTIO is defined "PKT" (Frame handles up to 4 chars only) + * but for the device name we want to emit "PKTIO" to distinguish from capability "PKT" + */ +#ifdef GPRS + if (des_param.dev_id EQ DTI_ENTITY_PKTIO) + { + tmp_des_name = pktioName; + } + + if (src_param.dev_id EQ DTI_ENTITY_PKTIO) + { + tmp_src_name = pktioName; + } +#endif + sprintf (g_sa,"%s: %d,\"%s\",%x,%d,\"%s\",\"%s\",%x,%d,%d", "%DATA", + mode, + tmp_des_name, + des_devId, + des_param.sub_no, + ati_cap_name[capability].name, + tmp_src_name, + src_devId, + src_param.sub_no, + cid); + + io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); + } + /* + * when qAT_PercentDATA reached the end it returns with AT_FAIL, but check capability as sentinel + */ + if (des_param.capability EQ DEV_CPBLTY_NONE) + { + /* + * DEV_CPBLTY_NONE is the sentinel, that there are no further devices + */ + return (ATI_CMPL); + } + else if (des_param.dev_id EQ NOT_PRESENT_8BIT) + { + /* + * NOT_PRESENT_8BIT, there is no redirection at all, but print default + */ + sprintf (g_sa,"%s: 0,,0,0,,,0,0,0", "%DATA"); + io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); + return (ATI_CMPL); + } + + cmdCmeError (CME_ERR_Unknown); + return (ATI_FAIL); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : | +| STATE : code ROUTINE : setatPercentDINF | ++--------------------------------------------------------------------+ + + PURPOSE : show list of available data and ATI channels and capabilities + %DINF=<mode> mode: 0=current, 1=other +*/ + +GLOBAL T_ATI_RSLT setatPercentDINF( char *cl, UBYTE srcId ) +{ + UBYTE mode = (UBYTE)-1; /* mode is UBYTE type so typecasting -1 with UBYTE */ + T_ACI_RETURN ret = AT_FAIL; + T_CAP_ID capability = DEV_CPBLTY_NONE; + T_CAP_ID cur_cap = DEV_CPBLTY_NONE; + +#ifdef GPRS + char *pktioName = "PKTIO"; +#endif /* GPRS */ + U32 des_devId = NOT_PRESENT_32BIT; + + cl = parse (cl, "x", &mode); + if (!cl) + { + cmdCmeError (CME_ERR_Unknown); + return (ATI_FAIL); + } + +#ifdef FF_ATI_BAT + { + T_BAT_cmd_send cmd; + T_BAT_cmd_set_percent_dinf my_bat_set_percent_dinf; + + TRACE_FUNCTION("setatPercentDINF() calls bat_send() <=== as APPLICATION"); + + memset(&my_bat_set_percent_dinf, 0, sizeof(my_bat_set_percent_dinf)); + cmd.ctrl_params = BAT_CMD_SET_PERCENT_DINF; + cmd.params.ptr_set_percent_dinf = &my_bat_set_percent_dinf; + + my_bat_set_percent_dinf.mode = mode; + + bat_send(ati_bat_get_client(srcId), &cmd); + + return ATI_EXCT; /* executing, because response is passed by callback function */ + } +#else /* OLD FUNCTION BODY */ + { + T_DINF_PARAM device_para; + + TRACE_FUNCTION( "setatPercentDINF()" ); + + switch (mode) + { + case (SHOW_CURR_CHAN_INF): + { + /* + * we want to get the piece of information, which belongs to the srcId + */ + ret = sAT_PercentDINF ((T_ACI_CMD_SRC)srcId, mode, &device_para); + + if ((ret EQ AT_CMPL) AND (device_para.src_id EQ srcId)) + { + char *tmp_des_name = dti_entity_name[device_para.dev_id].name; + capability = map_dti_cpblty (device_para.capability); + cur_cap = map_dti_cpblty (device_para.cur_cap); + /* With the device number, driver number and the dio id, form + the device identifier of the destination and + present to the terminal */ + + des_devId = (((U32)device_para.dev_no) + |((U32) (device_para.driver_id <<24)) + |((U32) (device_para.dio_ctrl_id <<8))); + + + /* + * unfortunately in custom.h for PKTIO is defined "PKT" (Frame handles up to 4 chars only) + * but for the device name we want to emit "PKTIO" to distinguish from capability "PKT" + */ +#ifdef GPRS + if (device_para.dev_id EQ DTI_ENTITY_PKTIO) + { + tmp_des_name = pktioName; + } +#endif + + sprintf (g_sa,"%s:\"%s\",%x,%d,\"%s\",\"%s\",%d", "%DINF", + tmp_des_name, + des_devId, + device_para.sub_no, + ati_cap_name[capability].name, + ati_cap_name[cur_cap].name, + mode); /* current channel */ + + + + io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); + return (ATI_CMPL); + } + else + { + break; /* an error */ + } + } + case (SHOW_ALL_CHAN_INF): + { + device_para.capability = 0xAA; /* init with a value which makes never sense, but is valuable for debug */ + /* + * we want to get the pieces of information to all devices + */ + while ((ret = sAT_PercentDINF ((T_ACI_CMD_SRC)srcId, mode, &device_para)) EQ AT_CMPL) + { + char *tmp_des_name = dti_entity_name[device_para.dev_id].name; + if (device_para.src_id EQ srcId) + { + mode = SHOW_CURR_CHAN_INF; /* this is the current channel, so temporarily set mode */ + } + else + { + mode = SHOW_ALL_CHAN_INF; /* other channel */ + } + + capability = map_dti_cpblty (device_para.capability); + cur_cap = map_dti_cpblty (device_para.cur_cap); + /* With the device number, driver number and the dio id, form + the device identifier of the destination and + present to the terminal */ + + des_devId = (((U32)device_para.dev_no) + |((U32) (device_para.driver_id <<24)) + |((U32) (device_para.dio_ctrl_id <<8))); + + + + /* + * unfortunately in custom.h for PKTIO is defined "PKT" (Frame handles up to 4 chars only) + * but for the device name we want to emit "PKTIO" to distinguish from capability "PKT" + */ +#ifdef GPRS + if (device_para.dev_id EQ DTI_ENTITY_PKTIO) + { + tmp_des_name = pktioName; + } +#endif + sprintf (g_sa,"%s:\"%s\",%x,%d,\"%s\",\"%s\",%d", "%DINF", + tmp_des_name, + des_devId, + device_para.sub_no, + ati_cap_name[capability].name, + ati_cap_name[cur_cap].name, + mode); + io_sendMessage (srcId, g_sa, ATI_NORMAL_OUTPUT); + mode = SHOW_ALL_CHAN_INF; /* reset to show all channels */ + } + /* + * when sAT_PercentDINF reached the end it returns with AT_FAIL, but check capability as sentinel + */ + if (device_para.capability EQ DEV_CPBLTY_NONE) + { + /* + * DEV_CPBLTY_NONE is the sentinel, that there are no further devices + */ + return (ATI_CMPL); + } + + break; /* an error */ + } + default: + { + break; /* an error */ + } + } + + cmdCmeError (CME_ERR_Unknown); + return (ATI_FAIL); + } +#endif /* no FF_ATI_BAT*/ +} + +#endif /* ATI_DTI_C */ +#endif /* DTI */ +