Files
svc.ems/plat/8ecp/src/8ecp.c
2024-09-27 15:39:34 +08:00

289 lines
8.0 KiB
C

#include "./include/8ecp.h"
#include <stdlib.h>
#include <stdio.h>
#include "./include/8ecp_debug.h"
SAP_In_8ECP SAPIn8ECP;
//time_t t[_8KE1_NUM]; //save the time when the heartbeat message of a 8KE1 was received.
BYTE s_msg[128];
Card_Struct card_struct[_8KE1_NUM];
int _8ecp_bind (_8ECP_SAP * sap)
{
if (SAPIn8ECP.inUse == InUse)
{
perror ("unable to bind a SAP, because the SAP is in use.");
return -1;
}
else //If bind successful, save the user name and the functions
{
SAPIn8ECP.inUse = InUse;
strcpy (SAPIn8ECP._8ecp_sap.name, (*sap).name);
SAPIn8ECP._8ecp_sap.update_mg_status = sap->update_mg_status;
SAPIn8ECP._8ecp_sap.update_trk_status = sap->update_trk_status;
return 0;
}
}
int _8ecp_unbind (BYTE sapIndex)
{
if (sapIndex != 0)
{
perror ("unable to unbind the SAP, because the SAP is not in use");
return -1;
}
else //If unbind successful, set the default value of SAPIn8ECP
{
SAPIn8ECP.inUse = NotInUse;
memset (SAPIn8ECP._8ecp_sap.name, 0,
strlen (SAPIn8ECP._8ecp_sap.name));
SAPIn8ECP._8ecp_sap.update_mg_status = NULL;
SAPIn8ECP._8ecp_sap.update_trk_status = NULL;
return 0;
}
}
int _8ecp_createMG(WORD mgNo, DWORD ip, BYTE cardNo)
{
card_struct[cardNo].mgNo = mgNo;
card_struct[cardNo].ip = ip;
return 1;
}
int _8ecp_deleteMG(WORD mgNo, DWORD ip, BYTE cardNo)
{
if(card_struct[cardNo].ip != ip)
{
printf("the ip is not correct, in 8ecp the ip of card %d is: %ld\n", cardNo, card_struct[cardNo].ip);
return 0;
}
if(card_struct[cardNo].mgNo != mgNo)
{
printf("the mgNo is not correct, in 8ecp the mgNo of card %d is: %d\n", cardNo, card_struct[cardNo].mgNo);
return 0;
}
card_struct[cardNo].ip = 0;;
card_struct[cardNo].mgNo = 0;
return 1;
}
/*
calcurate the IP address where the 8ECP PDU will be sent to
*/
struct sockaddr_in getIP (WORD orgChnl)
{
//char ip3, ip[16];
//WORD mgNo;
BYTE cardNo;
struct sockaddr_in s;
/* ip3 = orgChnl / 256; //the ID of the 8KE1
sprintf (ip, "172.18.%d.1", ip3);
*/
cardNo = orgChnl / 256;
memset (&s, 0, sizeof (struct sockaddr));
s.sin_family = AF_INET;
s.sin_port = htons (PORT);
s.sin_addr.s_addr = card_struct[cardNo].ip;
bzero (&(s.sin_zero), 8);
return s;
}
void _8ecp_connect_chnl (WORD orgChnl, WORD dstChnl, BYTE ecDisable)
{
//int i;
DWORD tempip;
_8ECP_PDU _8ecp_pdu;
message_list msg_list;
struct sockaddr_in sin_addr;
BYTE temstr[15];
if (!SAPIn8ECP.inUse)
{
perror ("SAP is not bind!");
return;
}
sin_addr = getIP (orgChnl);
memset (&_8ecp_pdu, 0, sizeof (struct _8ECP_PDU));
_8ecp_pdu.CPC_IFA_Inf = 0x87;
if (ecDisable == 0)
_8ecp_pdu.type = 0;
else if (ecDisable == 1)
_8ecp_pdu.type = 06;
else
{
perror ("the value of ecDisable is error!");
return;
}
_8ecp_pdu.sourceTimeSlotNo = orgChnl % 256; //the ID of the timeslot on the 8KE1
_8ecp_pdu.dstModuleID = dstChnl / 256;
_8ecp_pdu.dstTimeSlotNo = dstChnl % 256;
msg_list.msgSrcPort = PORT;
msg_list.msgDstIP = sin_addr.sin_addr.s_addr;
tempip = ntohl(msg_list.msgDstIP);
msg_list.msgDstPort = PORT;
msg_list.msgLength = sizeof (_8ecp_pdu);
memcpy (msg_list.msgContent, &_8ecp_pdu, msg_list.msgLength);
memcpy(&temstr,&_8ecp_pdu, msg_list.msgLength);
log_procedure(0, temstr); //0:Send msg 1:recv msg
iptrPutMessage (msg_list);
}
void _8ecp_connect_dtmf (WORD orgChnl, WORD dstChnl, BYTE dtmfNo)
{
struct sockaddr_in sin_addr;
//int i;
BYTE temstr[15];
_8ECP_PDU _8ecp_pdu;
message_list msg_list;
if (!SAPIn8ECP.inUse)
{
perror ("SAP is not bind!");
return;
}
sin_addr = getIP (orgChnl);
memset (&_8ecp_pdu, 0, sizeof (struct _8ECP_PDU));
_8ecp_pdu.CPC_IFA_Inf = 0x87;
_8ecp_pdu.type = 03;
_8ecp_pdu.sourceTimeSlotNo = orgChnl % 256; //the ID of the timeslot on the 8KE1
_8ecp_pdu.dstModuleID = dstChnl / 256;
_8ecp_pdu.dstTimeSlotNo = dstChnl % 256;
_8ecp_pdu.Value = dtmfNo;
msg_list.msgSrcPort = PORT;
msg_list.msgDstIP = sin_addr.sin_addr.s_addr;
msg_list.msgDstPort = PORT;
msg_list.msgLength = sizeof (_8ecp_pdu);
memcpy (msg_list.msgContent, &_8ecp_pdu, msg_list.msgLength);
memcpy(&temstr, &_8ecp_pdu, msg_list.msgLength);
log_procedure(0, temstr);
iptrPutMessage (msg_list);
}
void _8ecp_connect_tone (WORD orgChnl, WORD dstChnl, BYTE toneNo, WORD duration)
{
struct sockaddr_in sin_addr;
//int i;
BYTE temstr[15];
_8ECP_PDU _8ecp_pdu;
message_list msg_list;
sin_addr = getIP (orgChnl);
if (!SAPIn8ECP.inUse)
{
perror ("SAP is not bind!");
return;
}
sin_addr = getIP (orgChnl);
memset (&_8ecp_pdu, 0, sizeof (struct _8ECP_PDU));
_8ecp_pdu.CPC_IFA_Inf = 0x87;
_8ecp_pdu.type = 2;
_8ecp_pdu.sourceTimeSlotNo = orgChnl % 256; //the ID of the timeslot on the 8KE1
_8ecp_pdu.dstModuleID = dstChnl / 256;
_8ecp_pdu.dstTimeSlotNo = dstChnl % 256;
_8ecp_pdu.Value = toneNo;
_8ecp_pdu.duration = duration;
msg_list.msgSrcPort = PORT;
msg_list.msgDstIP = sin_addr.sin_addr.s_addr;
msg_list.msgDstPort = PORT;
msg_list.msgLength = sizeof (_8ecp_pdu);
memcpy (msg_list.msgContent, &_8ecp_pdu, msg_list.msgLength);
memcpy(&temstr, &_8ecp_pdu, msg_list.msgLength);
log_procedure(0, temstr);
iptrPutMessage (msg_list);
}
void _8ecp_timer ()
{
_8ecp_mon ();
}
int trap_proc (BYTE oid_len, DWORD * oid_ptr, BYTE * pdata, BYTE msg_len,
snmp_addr * addr)
{
DWORD * oid_in;
WORD mgNo;
BYTE cardNo;
BYTE temstr[128];
//int i, index;
//time_t now;
if(oid_ptr[10] != 1)
return 0;
if(oid_ptr[11] != 1)
return 0;
if(oid_ptr[12] != 4)
return 0;
log_procedure(1, pdata);
memset(&temstr, 0, sizeof(temstr));
oid_in = oid_ptr + OID_Prefix;
cardNo = E1NumOnCSU * pdata[0] + pdata[1];
mgNo = card_struct[cardNo].mgNo;
if ((SAPIn8ECP._8ecp_sap.update_mg_status == NULL)||(mgNo == 0))
return 0;
else
SAPIn8ECP._8ecp_sap.update_mg_status (mgNo, 1);
if ((SAPIn8ECP._8ecp_sap.update_trk_status == NULL) || (mgNo ==0))
return 0;
else
{
{
if(pdata[25]&0x01)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 0, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 0, 0); //trk on MG is nok
}
{
if(pdata[25]&0x02)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 1, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 1, 0); //trk on MG is nok
}
{
if(pdata[25]&0x04)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 2, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 2, 0); //trk on MG is nok
}
{
if(pdata[25]&0x08)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 3, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 3, 0); //trk on MG is nok
}
{
if(pdata[25]&0x10)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 4, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 4, 0); //trk on MG is nok
}
{
if(pdata[25]&0x20)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 5, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 5, 0); //trk on MG is nok
}
{
if(pdata[25]&0x40)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 6, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 6, 0); //trk on MG is nok
}
{
if(pdata[25]&0x80)
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 7, 1); //trk on MG is nok
else
SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 7, 0); //trk on MG is nok
}
}
return 0;
}
void _8ecp_init ()
{
printf ("8ECP init start!\n");
SAPIn8ECP.inUse = NotInUse;
memset (SAPIn8ECP._8ecp_sap.name, 0, sizeof (SAPIn8ECP._8ecp_sap.name));
SAPIn8ECP._8ecp_sap.update_mg_status = NULL;
SAPIn8ECP._8ecp_sap.update_trk_status = NULL;
//memset (&t, 0, sizeof (t));
memset(&card_struct, 0, sizeof(Card_Struct));
_8ecp_debug_set ();
inquire_trapmsg ((void *) trap_proc); //register, get heartbeat msg
printf ("8ECP init complete!\n");
}