Cisco SX80 codec control
champ
Posts: 261
Has anyone had much luck with a Cisco SX80.
I am using the AMX module and getting no feedback at all.
Using IP it just doesn't work and using RS232 it works but feedback isn't working.
The 'xcommand' strings work (so baud rate and login details are correct) but the response strings from the codec are all hex strings that don't look anything like the standard responses from a Cisco codec.
The real problem is that the SX80 doesn't have an on screen menu so I can't use it for the addressbook and the addressbook doesn't work so the client is pretty unimpressed with having to manually type in the address for every phone call.
Any tips would be appreciated.
I am using the AMX module and getting no feedback at all.
Using IP it just doesn't work and using RS232 it works but feedback isn't working.
The 'xcommand' strings work (so baud rate and login details are correct) but the response strings from the codec are all hex strings that don't look anything like the standard responses from a Cisco codec.
The real problem is that the SX80 doesn't have an on screen menu so I can't use it for the addressbook and the addressbook doesn't work so the client is pretty unimpressed with having to manually type in the address for every phone call.
Any tips would be appreciated.
0
Comments
That said the phonebook example is crap and doesn't really work until you rewrite.
Just checking the normal stuff - have you looked in telnet of the AMX processor and compared to telnet of the SX80 to see where its stopping at?
For IP have you checked you entered the IP/user/password info?
I gave up on serial control, it just sends back garbage.
The addressbook works after you do a lot of massage to the demo.
'DIALID-' doesn't work so you have to do this command instead:
'DIALNUMBER-' doesn't work without adding the call type and 'Auto' doesn't work.
The only call type that worked was 'Sip' so I hard coded all the calls to:
To get the phone book to populate you need to:
1. Select the address book type (ie. nCurrentZone = 1 for local or 2 for global).
2. Search the address book:
The demo makes you do this by adding another step where you pop up a keypad and enter a search string.
At least I managed to get away without having to re-write the whole module for once but I still lost a day and a half on what should have taken an hour or two.
My first guess would be the baud rate the module is using did not match the baud rate set in the codec. I also had issues with the serial communication dropping characters at the "suggested" data rate, and have settled in at 19200 for the time being.
SEND_COMMAND vdvVTC,"'PROPERTY-Baud_Rate,19200'"
IP hasn't had many issues, but due to site network and security issues, the client has preferred sticking with 232.
New driver Cisco_SX80_v1_0_4_dr1_0_0 found in InConcert Resource Center (Mar 12 2015 ).
Duet Module Interface Specification document
1/27/15 Revision v1.0.4
RPM Phonebook implantation
Added support for channels 330,331 (feedback input/presentation and graphics/presentation as mutually exclusive channels)
On page 25 Device notes:
Default baudrate is 38400, recommended for stable RS232 control.
Default baudrate is 115200 recommended for new masters.
SEND_COMMAND vdvCiscoSX80,"'PROPERTY-Baud_Rate,115200'"
When I did load the addressbook more than once the result was never the same, It was alway`s missing some contacts.
Any update to this? I am about to implement this using Cisco_SX80_v1_0_7_dr1_0_0. Can anyone advise if they had luck with the Corporate directory?
Thanks
DEFINE_TYPE
STRUCTURE PHONEBOOK
{
INTEGER iParentFolder
INTEGER iFirstChild
CHAR sEntryName[100]
CHAR sFolderID[100]
INTEGER iChildCount
}
STRUCTURE ContactMethod
{
CHAR sContactNumber[100]
CHAR sCallRate[20]
CHAR sCallProtocol[10]
}
DEFINE_CONSTANT
ciPHONEBOOKMAXENTRIES=150
ciPHONEBOOKMAXMETHODS=300
DEFINE_VARIABLE
VOLATILE CHAR CODEC_BUFFER[50000]
VOLATILE PHONEBOOK pbEntries[ciPHONEBOOKMAXENTRIES]
VOLATILE ContactMethod cmMethods[ciPHONEBOOKMAXMETHODS]
//VOLATILE PHONEBOOK pbEntries[150]
//VOLATILE ContactMethod cmMethods[300]
VOLATILE INTEGER iReceivingPhoneBook
VOLATILE INTEGER iPhoneBookDownloadBusy
DEFINE_CALL 'fClearPhonebook' //CLEAR ENTRIES IN PHONEBOOK
{
INTEGER fiA
for(fiA = 0; fiA<(ciPHONEBOOKMAXENTRIES);fiA++)
{
pbEntries[fiA].iParentFolder = 0
pbEntries[fiA].iFirstChild = 0
SET_LENGTH_STRING ((pbEntries[fiA].sEntryName),0)
SET_LENGTH_STRING ((pbEntries[fiA].sFolderId),0)
pbEntries[fiA].iChildCount = 0
}
for(fiA = 0; fiA<(ciPHONEBOOKMAXMETHODS);fiA++)
{
SET_LENGTH_STRING ((cmMethods[fiA].sContactNumber),0)
SET_LENGTH_STRING ((cmMethods[fiA].sCallRate),0)
SET_LENGTH_STRING ((cmMethods[fiA].sCallProtocol),0)
}
}
DEFINE_CALL 'PROCESSPHONEBOOK' //LOAD PHONEBOOK ENTRIES FROM CODEC USING BUFFER
{
CODEC_POLL=0 //TURN OFF POLLING
CALL 'fClearPhonebook' //DELETE ANY EXISTING ENTRIES
WAIT 10 'BUFFER1'
{
SET_LENGTH_STRING(CODEC_BUFFER,0) //EMPTY THE BUFFER
}
WAIT 50 'BUFFER5'
{
SET_LENGTH_STRING(CODEC_BUFFER,0) //EMPTY THE BUFFER
iReceivingPhoneBook = 1 //NOT PROCESSING
iPhoneBookDownloadBusy = 1 //FLAG - DOWNLOAD ACTIVE
SEND_STRING CODEC,"'xCommand Phonebook Search',$0D,$0A" //SEARCH PHONEBOOK
}
WAIT 150 'BUFFER15'
{
iPhoneBookDownloadBusy = 0 //FLAG - DOWNLOAD NOW INACTIVE
iReceivingPhoneBook = 1 //NOT PROCESSING
CODEC_POLL=1 //START POLLING CODEC AGAIN
SET_LENGTH_STRING(CODEC_BUFFER,0)
CALL 'LOADPHONEBOOK' //DISPLAYS THE STARTING PHONEBOOK ENTRIES ON VTC CONF PAGE
}
}
DATA_EVENT[CODEC]
{
STRING:
{
//LOCAL_VAR CHAR TEMP_BUFFER[15999]
//LOCAL_VAR CHAR TRASH_BUFFER[15999]
LOCAL_VAR CHAR TEMP_BUFFER[50000]
LOCAL_VAR CHAR TRASH_BUFFER[50000]
LOCAL_VAR INTEGER ROW
LOCAL_VAR INTEGER TRASH_LEN
IF(FIND_STRING(CODEC_BUFFER,"'Status: Connected',$0D,$0A",1)&& !START)
{
CODEC_CALL_STATUS=1 //CONNECTED
TEMP_BUFFER=REMOVE_STRING(CODEC_BUFFER,'Status:',1)
TRASH_BUFFER=REMOVE_STRING(TEMP_BUFFER, 'CALL ',1)
SET_LENGTH_STRING(TEMP_BUFFER,LENGTH_STRING(TEMP_BUFFER)-8)
CODEC_CALL_ID=ATOI(TEMP_BUFFER) //CODEC CALL ID
}
IF(FIND_STRING(CODEC_BUFFER,"'** end',$0D,$0A",1))
{
if(iPhoneBookDownloadBusy = 1) //WERE WE DOWNLOADING PHONEBOOK?
{
iReceivingPhoneBook = 0 //START PROCESSING
ROW=1 //INITIAL NUMBER OF ROWS
SET_LENGTH_STRING(TEMP_BUFFER,0)
SET_LENGTH_STRING(TRASH_BUFFER,0)
}
}
WHILE(FIND_STRING(CODEC_BUFFER,'*r ResultSet',1) && iPhoneBookDownloadBusy && !iReceivingPhoneBook)
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'*r ResultSet',1)
SELECT
{
ACTIVE(FIND_STRING(CODEC_BUFFER,' ResultInfo Offset: ',1)) :
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'ResultInfo Offset: ',1)
SET_LENGTH_STRING(TEMP_BUFFER,0)
}
ACTIVE(FIND_STRING(CODEC_BUFFER,' ResultInfo Limit: ',1)) :
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'ResultInfo Limit: ',1)
SET_LENGTH_STRING(TEMP_BUFFER,0)
}
ACTIVE(FIND_STRING(CODEC_BUFFER,' ResultInfo TotalRows:',1)) :
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'TotalRows: ',1)
}
ACTIVE(FIND_STRING(CODEC_BUFFER,' Contact ',1)) : //CONTACT INFO STARTS HERE
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'Contact ',1)
IF(FIND_STRING(CODEC_BUFFER,'Name: ',1))
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'Name: ',1) //REMOVE UP TO FIRST QUOTE
TRASH_BUFFER= REMOVE_STRING(CODEC_BUFFER,"$0D",1) //CAPTURE THE NAME
TRASH_LEN=LENGTH_STRING(TRASH_BUFFER)
TEMP_BUFFER=LEFT_STRING(TRASH_BUFFER,(TRASH_LEN-1)) //GET RID OF END $0D
TRASH_LEN=LENGTH_STRING(TEMP_BUFFER)
TRASH_BUFFER=LEFT_STRING(TEMP_BUFFER,(TRASH_LEN-1)) //GET RID OF END "
TRASH_LEN=LENGTH_STRING(TRASH_BUFFER)
pbEntries[ROW].sEntryName=RIGHT_STRING(TRASH_BUFFER,(TRASH_LEN-1)) //REMOVE FRONT "
}
IF(FIND_STRING(CODEC_BUFFER,'ContactId: ',1))
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'ContactId: ',1) //REMOVE UP TO FIRST QUOTE
}
IF(FIND_STRING(CODEC_BUFFER,'Number: ',1))
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'Number: ',1) //REMOVE UP TO FIRST QUOTE
TRASH_BUFFER= REMOVE_STRING(CODEC_BUFFER,"$0D",1) //CAPTURE THE CALL RATE
TRASH_LEN=LENGTH_STRING(TRASH_BUFFER)
TEMP_BUFFER=LEFT_STRING(TRASH_BUFFER,(TRASH_LEN-1)) //GET RID OF END $0D
TRASH_LEN=LENGTH_STRING(TEMP_BUFFER)
TRASH_BUFFER=LEFT_STRING(TEMP_BUFFER,(TRASH_LEN-1)) //GET RID OF END "
TRASH_LEN=LENGTH_STRING(TRASH_BUFFER)
cmMethods[ROW].sContactNumber=RIGHT_STRING(TRASH_BUFFER,(TRASH_LEN-1)) //REMOE FIRST "
}
IF(FIND_STRING(CODEC_BUFFER,'Protocol: ',1))
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'Protocol: ',1)
TRASH_BUFFER= REMOVE_STRING(CODEC_BUFFER,"$0D",1) //CAPTURE THE CALL RATE
TRASH_LEN=LENGTH_STRING(TRASH_BUFFER)
cmMethods[ROW].sCallProtocol=LEFT_STRING(TRASH_BUFFER,(TRASH_LEN-1))
}
IF(FIND_STRING(CODEC_BUFFER,'Device: ',1))
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'Device: ',1)
//DONE
}
IF(FIND_STRING(CODEC_BUFFER,'CallRate: ',1))
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'CallRate: ',1)
TRASH_BUFFER= REMOVE_STRING(CODEC_BUFFER,"$0D",1) //CAPTURE THE CALL RATE
TRASH_LEN=LENGTH_STRING(TRASH_BUFFER)
cmMethods[ROW].sCallRate=LEFT_STRING(TRASH_BUFFER,(TRASH_LEN-1))
}
IF(FIND_STRING(CODEC_BUFFER,'CallType: ',1))
{
TEMP_BUFFER = REMOVE_STRING(CODEC_BUFFER,'CallType: ',1)
ROW=ROW+1 //INCREASE THE ROW COUNTER
//DONE
}
}
}
}
}
}