void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
{
	SS7_FUNC_TRACE_ENTER (__FUNCTION__);
	
	sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;
	SiCnStEvnt acm;
	
	memset (&acm, 0x0, sizeof (acm));
	
	/* fill in the needed information for the ACM */
	acm.bckCallInd.eh.pres 				= PRSNT_NODEF;
	acm.bckCallInd.chrgInd.pres			= PRSNT_NODEF;
	acm.bckCallInd.chrgInd.val			= CHRG_CHRG;
	acm.bckCallInd.cadPtyStatInd.pres	= PRSNT_NODEF;
	acm.bckCallInd.cadPtyStatInd.val	= 0x01;
	acm.bckCallInd.cadPtyCatInd.pres	= PRSNT_NODEF;
	acm.bckCallInd.cadPtyCatInd.val		= CADCAT_ORDSUBS;
	acm.bckCallInd.end2EndMethInd.pres	= PRSNT_NODEF;
	acm.bckCallInd.end2EndMethInd.val	= E2EMTH_NOMETH;
	acm.bckCallInd.intInd.pres			= PRSNT_NODEF;
	acm.bckCallInd.intInd.val 			= INTIND_NOINTW;
	acm.bckCallInd.end2EndInfoInd.pres	= PRSNT_NODEF;
	acm.bckCallInd.end2EndInfoInd.val	= E2EINF_NOINFO;
	acm.bckCallInd.isdnUsrPrtInd.pres	= PRSNT_NODEF;
	acm.bckCallInd.isdnUsrPrtInd.val	= ISUP_USED;
	acm.bckCallInd.holdInd.pres			= PRSNT_NODEF;
	acm.bckCallInd.holdInd.val			= HOLD_NOTREQD;
	acm.bckCallInd.isdnAccInd.pres		= PRSNT_NODEF;
	acm.bckCallInd.isdnAccInd.val		= ISDNACC_NONISDN;
	acm.bckCallInd.echoCtrlDevInd.pres	= PRSNT_NODEF;
	acm.bckCallInd.echoCtrlDevInd.val	= 0x1;	/* ec device present */
	acm.bckCallInd.sccpMethInd.pres		= PRSNT_NODEF;
	acm.bckCallInd.sccpMethInd.val		= SCCPMTH_NOIND;
	
	/* send the ACM request to LibSngSS7 */
	sng_cc_con_status  (1,
						sngss7_info->suInstId,
						sngss7_info->spInstId,
						sngss7_info->circuit->id, 
						&acm, 
						ADDRCMPLT);
	
	SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ACM\n", sngss7_info->circuit->cic);
	
	SS7_FUNC_TRACE_EXIT (__FUNCTION__);
	return;
}
/* French SPIROU send Charging Acknowledgement */
void ft_to_sngss7_txa (ftdm_channel_t * ftdmchan)
{
#ifndef SANGOMA_SPIROU
    SS7_FUNC_TRACE_ENTER (__FUNCTION__);
    ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "TXA message not supported!, please update your libsng_ss7\n");
#else
    SiCnStEvnt txa;
    sngss7_chan_data_t	*sngss7_info = ftdmchan->call_data;
    SS7_FUNC_TRACE_ENTER (__FUNCTION__);

    memset (&txa, 0x0, sizeof(txa));

    sng_cc_con_status(1, sngss7_info->suInstId, sngss7_info->spInstId, sngss7_info->circuit->id, &txa, CHARGE_ACK);

    SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx TXA\n", sngss7_info->circuit->cic);
#endif
    SS7_FUNC_TRACE_EXIT (__FUNCTION__);
    return;
}
/* No one calls this function yet, but it has been implemented to complement TXA messages */
void ft_to_sngss7_itx (ftdm_channel_t * ftdmchan)
{
#ifndef SANGOMA_SPIROU
    SS7_FUNC_TRACE_ENTER (__FUNCTION__);
    ftdm_log_chan_msg(ftdmchan, FTDM_LOG_CRIT, "ITX message not supported!, please update your libsng_ss7\n");
#else
    const char* var = NULL;
    sngss7_chan_data_t	*sngss7_info = ftdmchan->call_data;
    SiCnStEvnt itx;

    SS7_FUNC_TRACE_ENTER (__FUNCTION__);

    memset (&itx, 0x0, sizeof (itx));

    itx.msgNum.eh.pres = PRSNT_NODEF;
    itx.msgNum.msgNum.pres = PRSNT_NODEF;
    var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_itx_msg_num");
    if (!ftdm_strlen_zero(var)) {
        itx.msgNum.msgNum.val = atoi(var);
    } else {
        itx.msgNum.msgNum.val = 0x1;
    }

    itx.chargUnitNum.eh.pres = PRSNT_NODEF;
    itx.chargUnitNum.chargUnitNum.pres = PRSNT_NODEF;
    var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "ss7_itx_charge_unit");
    if (!ftdm_strlen_zero(var)) {
        itx.chargUnitNum.chargUnitNum.val = atoi(var);
    } else {
        itx.chargUnitNum.chargUnitNum.val = 0x1;
    }

    ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "ITX Charging Unit:%d Msg Num:%d\n", itx.chargUnitNum.chargUnitNum.val, itx.msgNum.msgNum.val);
    sng_cc_con_status  (1, sngss7_info->suInstId, sngss7_info->spInstId, sngss7_info->circuit->id, &itx, CHARGE_UNIT);

    SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ITX\n", sngss7_info->circuit->cic);
#endif
    SS7_FUNC_TRACE_EXIT (__FUNCTION__);
    return;
}
void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
{
    SS7_FUNC_TRACE_ENTER (__FUNCTION__);

    sngss7_chan_data_t	*sngss7_info = ftdmchan->call_data;
    SiCnStEvnt acm;

    memset (&acm, 0x0, sizeof (acm));

    /* fill in the needed information for the ACM */
    acm.bckCallInd.eh.pres 				= PRSNT_NODEF;
    acm.bckCallInd.chrgInd.pres			= PRSNT_NODEF;
    acm.bckCallInd.chrgInd.val			= CHRG_CHRG;
    acm.bckCallInd.cadPtyStatInd.pres	= PRSNT_NODEF;
    acm.bckCallInd.cadPtyStatInd.val	= 0x01;
    acm.bckCallInd.cadPtyCatInd.pres	= PRSNT_NODEF;
    acm.bckCallInd.cadPtyCatInd.val		= CADCAT_ORDSUBS;
    acm.bckCallInd.end2EndMethInd.pres	= PRSNT_NODEF;
    acm.bckCallInd.end2EndMethInd.val	= E2EMTH_NOMETH;
    acm.bckCallInd.intInd.pres			= PRSNT_NODEF;
    acm.bckCallInd.intInd.val 			= INTIND_NOINTW;
    acm.bckCallInd.end2EndInfoInd.pres	= PRSNT_NODEF;
    acm.bckCallInd.end2EndInfoInd.val	= E2EINF_NOINFO;
    acm.bckCallInd.isdnUsrPrtInd.pres	= PRSNT_NODEF;
    acm.bckCallInd.isdnUsrPrtInd.val	= ISUP_USED;
    acm.bckCallInd.holdInd.pres			= PRSNT_NODEF;
    acm.bckCallInd.holdInd.val			= HOLD_NOTREQD;
    acm.bckCallInd.isdnAccInd.pres		= PRSNT_NODEF;
    acm.bckCallInd.isdnAccInd.val		= ISDNACC_NONISDN;
    acm.bckCallInd.echoCtrlDevInd.pres	= PRSNT_NODEF;
    switch (ftdmchan->caller_data.bearer_capability) {
    /**********************************************************************/
    case (FTDM_BEARER_CAP_SPEECH):
        acm.bckCallInd.echoCtrlDevInd.val	= 0x1;
        break;
    /**********************************************************************/
    case (FTDM_BEARER_CAP_UNRESTRICTED):
        acm.bckCallInd.echoCtrlDevInd.val	= 0x0;
        break;
    /**********************************************************************/
    case (FTDM_BEARER_CAP_3_1KHZ_AUDIO):
        acm.bckCallInd.echoCtrlDevInd.val	= 0x1;
        break;
    /**********************************************************************/
    default:
        SS7_ERROR_CHAN(ftdmchan, "Unknown Bearer capability falling back to speech%s\n", " ");
        acm.bckCallInd.echoCtrlDevInd.val	= 0x1;
        break;
        /**********************************************************************/
    } /* switch (ftdmchan->caller_data.bearer_capability) */
    acm.bckCallInd.sccpMethInd.pres		= PRSNT_NODEF;
    acm.bckCallInd.sccpMethInd.val		= SCCPMTH_NOIND;

    /* fill in any optional parameters */
    if (sngss7_test_options(&g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id], SNGSS7_ACM_OBCI_BITA)) {
        SS7_DEBUG_CHAN(ftdmchan, "Found ACM_OBCI_BITA flag:0x%X\n", g_ftdm_sngss7_data.cfg.isupCkt[sngss7_info->circuit->id].options);
        acm.optBckCalInd.eh.pres				= PRSNT_NODEF;
        acm.optBckCalInd.inbndInfoInd.pres		= PRSNT_NODEF;
        acm.optBckCalInd.inbndInfoInd.val		= 0x1;
        acm.optBckCalInd.caFwdMayOcc.pres		= PRSNT_DEF;
        acm.optBckCalInd.simpleSegmInd.pres		= PRSNT_DEF;
        acm.optBckCalInd.mlppUserInd.pres		= PRSNT_DEF;
        acm.optBckCalInd.usrNetIneractInd.pres	= PRSNT_DEF;
    } /* if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) */

    /* send the ACM request to LibSngSS7 */
    sng_cc_con_status  (1,
                        sngss7_info->suInstId,
                        sngss7_info->spInstId,
                        sngss7_info->circuit->id,
                        &acm,
                        ADDRCMPLT);

    SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx ACM\n", sngss7_info->circuit->cic);

    SS7_FUNC_TRACE_EXIT (__FUNCTION__);
    return;
}