PROGRAM_NAME='PICTURETEL 4000 (SINGLE MONITOR CONFIG.), REV4 ** NDA **' (* DATE:03/18/95 TIME:15:13:03 *) (***********************************************************) (* The following code block is provided as a guide to *) (* programming the device(s) listed above. This is a *) (* sample only, and will most likely require modification *) (* to be integrated into a master program. *) (* *) (* Device-specific protocols should be obtained directly *) (* from the equipment manufacturer to ensure compliance *) (* with the most current versions. Within the limits *) (* imposed by any non-disclosure agreements, AMX will *) (* provide protocols upon request. *) (* *) (* If further programming assistance is required, please *) (* contact your AMX customer support team. *) (* *) (***********************************************************) (* THIS PROGRAM IS USED FOR A SINGLE MONITOR CONFIGURATION *) (* OF THE PICTURETEL 4000, CONTROLLING TWO CAMERAS (THE *) (* MAIN CAMERA AND THE AUXILIARY CAMERA). THE FOLLOWING *) (* DIAGRAM SHOWS THE BASIC LAYOUT OF THE MONITOR DISPLAY *) (* *) (* ------------------ *) (* | | *) (* | MAIN <---------- PREVIEW *) (* | | SOURCES *) (* | -------- | (DISPLAY) *) (* | | | | *) (* | | PIP |<------ SEND VIDEO *) (* | | | | SOURCES OR *) (* | -------- | FAR END *) (* ------------------ *) (* *) (***********************************************************) (***********************************************************) (* DEVICE NUMBER DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_DEVICE CODEC = 1 (* AXC-232,1200 8O1,PICTURETEL 4000 *) TP = 128 (* AXP-EL+,TOUCH PANEL *) (***********************************************************) (* CONSTANT DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_CONSTANT MAXQ = 10 (* MAXIMUM NUMBER OF QUEUE ITEMS *) CMD_TIME = 100 (* COMMAND RESPONSE TIME OUT *) CALL_TIME = 100 (* AUDIO CALL TIME OUT *) (***********************************************************) (* VARIABLE DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_VARIABLE CODEC_LOCK (* LOCK FLAG FOR CODEC *) TILT_UP (* TILT UP STATUS *) TILT_DOWN (* TILT DOWN STATUS *) PAN_LEFT (* PAN LEFT STATUS *) PAN_RIGHT (* PAN RIGHT STATUS *) ZOOM_IN (* ZOOM IN STATUS *) ZOOM_OUT (* ZOOM OUT STATUS *) LOCAL_CAM (* TRACKS LAST LOCAL CAMERA ADDRESS *) CURRENT_CAM (* HOLDS CURRENT CAMERA ADDRESS *) STORE_PRESET (* STORING/RECALLING PSET *) CAM_PRESET[3] (* CURRENT CAMERA PRESET *) TEMP_PRESET (* TEMP STORAGE OF CAMERA PRESET *) NEAR_MODE (* INDICATES NEAR/FAR END CNTL *) DISPLAY (* CURRENT DISPLAY INPUT *) SEND_VID (* CURRENT SEND VID INPUT *) SEND_GPH (* CURRENT SEND GRAPICS INPUT *) POWER_STATUS (* POWER STATUS OF CODEC *) MENU (* STATUS OF MENU *) VOLUME_UP (* VOLUME UP STATUS *) VOLUME_DN (* VOLUME DOWN STATUS *) MUTE (* STATUS OF MUTE *) AUDIO_HOOK (* STATUS OF PHONE HOOK *) VIDEO_HOOK (* STATUS OF VIDEO HOOK *) INCOMING_AUDIO (* STATUS OF INCOMING VIDEO CALL *) INCOMING_VIDEO (* STATUS OF INCOMING AUDIO CALL *) IN_VID (* INDICATES IN VIDEO CALL *) IN_AUD (* INDICATES IN AUDIO CALL *) BUFFER[80] (* STATUS BACK BUFFER *) ENTER_HIT (* INDICATES IF ENTER HIT *) NUM1_STATE (* INDICATES IF ENTERING NUM 1 *) NUM2_STATE (* INDICATES IF ENTERING NUM 2 *) SPEED_STATE (* INDICATES IF ENTERING SPEED *) NUMBER1[25] (* HOLDS PHONE NUMBER 1 *) NUMBER2[25] (* HOLDS PHONE NUMBER 2 *) CAM_MATRIX[4] (* TRACK VIDEO SOURCE *) FLASH1 (* PROVIDES FLASHING FEEDBACK *) FLASH2 (* PROVIDES FLASHING FEEDBACK *) QCOUNT (* HOLDS NUMBER OF ITEMS IN QUEUE *) QUEUE[MAXQ][60] (* QUEUE OF CODEC COMMANDS *) PCOM[60] (* COMMAND EXTRACTED FROM QUEUE *) MSG[60] (* FIRST MESSAGE IN BUFFER *) (***********************************************************) (* LATCHING DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_LATCHING POWER_STATUS MUTE VIDEO_HOOK AUDIO_HOOK STORE_PRESET (***********************************************************) (* MUTUALLY EXCLUSIVE DEFINITIONS GO BELOW *) (***********************************************************) DEFINE_MUTUALLY_EXCLUSIVE (TILT_UP,TILT_DOWN) (PAN_LEFT,PAN_RIGHT) (ZOOM_IN,ZOOM_OUT) (***********************************************************) (* SUBROUTINES GO BELOW *) (***********************************************************) (*****************************) (* FUNCTION NAME: ADD QUEUE *) (* PURPOSE: TO ADD AN ITEM *) (* TO THE END OF A *) (* QUEUE *) (*****************************) DEFINE_CALL 'ADD QUEUE' ( ITEM[60] (* ITEM TO BE ADDED *) ) { IF (QCOUNT < MAXQ) (* IF QUEUE NOT FULL *) { QCOUNT = QCOUNT + 1 (* INCREMENT NUMBER OF ITEMS *) QUEUE[QCOUNT] = ITEM (* ADD ITEM TO END OF QUEUE *) } } (*********************************) (* FUNCTION NAME: REMOVE QUEUE *) (* PURPOSE: TO REMOVE THE FIRST *) (* ITEM IN A QUEUE *) (*********************************) DEFINE_CALL 'REMOVE QUEUE' ( ITEM[60] (* ITEM BEING REMOVED *) ) LOCAL_VAR I (* INDEX FOR WHILE LOOP *) { I = 1 (* SET INDEX TO 1 *) IF (QCOUNT > 0) (* IF QUEUE NOT EMPTY *) { ITEM = QUEUE[1] (* EXTRACT FIRST ITEM IN QUEUE *) WHILE (I < QCOUNT) (* WHILE NOT AT END OF QUEUE *) { QUEUE[I] = QUEUE[I+1] (* BUMP DOWN ITEMS IN QUEUE *) I = I + 1 (* INCREMENT QUEUE *) } QCOUNT = QCOUNT - 1 (* DECREMENT ITEMS IN QUEUE *) } } (************************************) (* FUNCTION NAME: COMMAND *) (* PURPOSE: ASSURES THAT CODEC *) (* IS IN CONTROL PROTOCOL *) (* VERSION 2 BEFORE *) (* ISSUING COMMANDS *) (************************************) DEFINE_CALL 'COMMAND' ( DEVICE, (* CODEC DEVICE # *) COMMAND[60] (* COMMAND *) ) LOCAL_VAR VER_0 (* VERSION 0 FLAG *) VER_1 (* VERSION 1 FLAG *) VER_2 (* VERSION 2 FLAG *) CODEC_STOP (* CODEC STOP FLAG *) JUNK[20] (* JUNK CHARACTERS *) CUR_CMD[60] (* CURRENT COMMAND *) { IF (!CODEC_LOCK) (* IF NOT BUSY *) { VER_0 = 0 (* CLEAR VERSION 0 *) VER_1 = 0 (* CLEAR VERSION 1 *) VER_2 = 0 (* CLEAR VERSION 2 *) CODEC_STOP = 0 (* CLEAR STOP *) CUR_CMD = COMMAND (* COPY COMMAND *) WAIT CMD_TIME 'TIME OUT' (* COMMAND TIMEOUT *) { OFF [CODEC_LOCK] (* UNLOCK CODEC *) SEND_STRING DEVICE,"$02,'lvr',$04" (* TELL CODEC 'OK' *) SEND_STRING DEVICE,"$02,'lrc',$04" (* START CODEC *) CALL 'ADD QUEUE' (CUR_CMD) (* ADD COMMAND *) CANCEL_WAIT_UNTIL 'VER REPLY' (* CLEAR WAIT UNTIL *) CANCEL_WAIT_UNTIL 'STOP REPLY' (* CLEAR WAIT UNTIL *) } ON [CODEC_LOCK] (* LOCK CODEC *) SEND_STRING DEVICE,"$02,'lqba',$04" (* REQUEST VERSION *) (* WAIT UNTIL SOME RESPONSE IN BUFFER *) WAIT_UNTIL (LENGTH_STRING(BUFFER) > 3) 'VER REPLY' { VER_0 = FIND_STRING(BUFFER,"$02,'airi',$04",1) VER_1 = FIND_STRING(BUFFER,"$02,'avr001',$04",1) VER_2 = FIND_STRING(BUFFER,"$02,'abba002',$04",1) SELECT { (* IF IN CONTROL PROTOCOL VERSION 2 *) ACTIVE (VER_2) : { CANCEL_WAIT 'TIME OUT' JUNK = REMOVE_STRING(BUFFER,"$02,'abba002',$04",VER_2) SEND_STRING DEVICE,"$02,CUR_CMD,$04" OFF [CODEC_LOCK] } (* IF IN CONTROL PROTOCOL VERISON 0 OR 1 *) ACTIVE (VER_0 || VER_1) : { IF (VER_0) JUNK = REMOVE_STRING(BUFFER,"$02,'airi',$04",VER_0) ELSE JUNK = REMOVE_STRING(BUFFER,"$02,'avr001',$04",VER_1) SEND_STRING DEVICE,"$02,'lps',$04" (* WAIT UNTIL CODEC IS STOPPED *) WAIT_UNTIL(FIND_STRING(BUFFER,"$02,'aws',$04",1)) 'STOP REPLY' { CANCEL_WAIT 'TIME OUT' CODEC_STOP = FIND_STRING(BUFFER,"$02,'aws',$04",1) JUNK = REMOVE_STRING(BUFFER,"$02,'aws',$04",CODEC_STOP) SEND_STRING DEVICE,"$02,'lvr',$04" SEND_STRING DEVICE,"$02,'lcb002',$04" SEND_STRING DEVICE,"$02,'lrc',$04" SEND_STRING DEVICE,"$02,CUR_CMD,$04" OFF [CODEC_LOCK] } } (* DEFAULT *) ACTIVE (1) : { CANCEL_WAIT 'TIME OUT' CALL 'ADD QUEUE' (CUR_CMD) OFF [CODEC_LOCK] } } } } ELSE (* IF BUSY *) CALL 'ADD QUEUE' (COMMAND) (* ADD TO QUEUE *) } (********************************) (* FUNCTION NAME: CLEAR WINDOW *) (* PURPOSE: CLEARS DIAL UP *) (* WINDOW *) (********************************) DEFINE_CALL 'CLEAR WINDOW' { SEND_COMMAND TP,'TEXT2-' (* CLEAR OUT TEXT *) SEND_COMMAND TP,'TEXT3-' SEND_COMMAND TP,'TEXT4-' SEND_COMMAND TP,'TEXT5-' SEND_COMMAND TP,'TEXT6-' SEND_COMMAND TP,'TEXT8-' SEND_COMMAND TP,'TEXT9-' SEND_COMMAND TP,'ICON2-0' (* CLEAR BORDERS *) SEND_COMMAND TP,'ICON3-0' SEND_COMMAND TP,'ICON4-0' SEND_COMMAND TP,'ICON5-0' SEND_COMMAND TP,'ICON6-0' SEND_COMMAND TP,'ICON7-0' SEND_COMMAND TP,'ICON8-0' SEND_COMMAND TP,'ICON9-0' } (*********************************) (* FUNCTION NAME: ENTER NUMBER *) (* PURPOSE: TO ADD AN INTEGER *) (* TO THE ASCII STRING *) (* FOR DIALING *) (*********************************) DEFINE_CALL 'ENTER NUMBER' ( NUMBER (* NUMBER TO BE ADDED *) ) { IF (NUM1_STATE) (* IF DIALING NUMBER 1 *) { NUMBER1 = "NUMBER1,NUMBER" (* ADD NUMBER TO STRING *) IF (LENGTH_STRING(NUMBER1) > 16) (* IF LENGTH IS OVER 16 *) SET_LENGTH_STRING(NUMBER1,16) (* SET LENGTH BACK *) SEND_COMMAND TP,"'TEXT3-',NUMBER1" (* DISPLAY NUMBER *) } ELSE IF (NUM2_STATE) (* IF DIALING NUMBER 2 *) { NUMBER2 = "NUMBER2,NUMBER" (* ADD NUMBER TO STRING *) IF (LENGTH_STRING(NUMBER2) > 16) (* IF LENGTH IS OVER 16 *) SET_LENGTH_STRING(NUMBER2,16) (* SET LENGTH BACK *) SEND_COMMAND TP,"'TEXT5-',NUMBER2" (* DISPLAY NUMBER *) } ELSE IF (SPEED_STATE) (* IF MAKING SPEED CALL *) { NUMBER1 = "NUMBER1,NUMBER" (* ADD NUMBER TO STRING *) IF (LENGTH_STRING(NUMBER1) > 2) (* IF LENGTH IS OVER 2 *) SET_LENGTH_STRING(NUMBER1,2) (* SET LENGTH BACK *) SEND_COMMAND TP,"'TEXT3-',NUMBER1" (* DISPLAY NUMBER *) } } (***********************************) (* FUNCTION NAME: REMOVE NUMBER *) (* PURPOSE: TO REMOVE A DIGIT *) (* FROM THE ASCII STRING *) (* FOR DIALING *) (***********************************) DEFINE_CALL 'REMOVE NUMBER' { IF (NUM1_STATE) (* IF DIALING NUMBER 1 *) { IF (LENGTH_STRING(NUMBER1)) (* IF ANY DIGITS EXIST *) { SET_LENGTH_STRING(NUMBER1,LENGTH_STRING(NUMBER1)-1) SEND_COMMAND TP,"'TEXT3-',NUMBER1" (* DISPLAY NUMBER *) } } ELSE IF (NUM2_STATE) (* IF DIALING NUMBER 2 *) { IF (LENGTH_STRING(NUMBER2)) (* IF ANY DIGITS EXIST *) { SET_LENGTH_STRING(NUMBER2,LENGTH_STRING(NUMBER2)-1) SEND_COMMAND TP,"'TEXT5-',NUMBER2" (* DISPLAY NUMBER *) } } ELSE IF (SPEED_STATE) (* IF MAKING SPEED CALL *) { IF (LENGTH_STRING(NUMBER1)) (* IF ANY DIGITS EXIST *) { SET_LENGTH_STRING(NUMBER1,LENGTH_STRING(NUMBER1)-1) SEND_COMMAND TP,"'TEXT3-',NUMBER1" (* DISPLAY NUMBER *) } } } (**********************************) (* FUNCTION NAME: SPEED DIAL *) (* PURPOSE: TO MAKE A SPEED DIAL *) (* VIDEO CALL *) (**********************************) DEFINE_CALL 'SPEED DIAL' LOCAL_VAR DIAL_NUMBER[2] { DIAL_NUMBER = '' (* CLEAR DIAL NUMBER *) SEND_COMMAND TP,'TEXT6-DIALING...' (* INDICATE DIALING *) IF (LENGTH_STRING(NUMBER1)) (* IF THERE IS A NUMBER *) { IF (LENGTH_STRING(NUMBER1) = 1) (* IF THERE IS ONLY 1 DIGIT *) { DIAL_NUMBER = "DIAL_NUMBER,'0'" (* BUFFER WITH ZERO *) DIAL_NUMBER = "DIAL_NUMBER,NUMBER1" } ELSE (* IF THERE ARE 2 DIGITS *) DIAL_NUMBER = NUMBER1 (* COPY IT OVER *) CALL 'COMMAND' (CODEC,"'ldp',DIAL_NUMBER,'e'") } ELSE (* IF THERE IS NO NUMBER *) CALL 'CLEAR WINDOW' (* CLEAR THE WINDOWS *) } (*******************************) (* FUNCTION CALL: DIAL NUMBER *) (* PURPOSE: TO DIAL ENTERED *) (* PHONE NUMBER(S) *) (*******************************) DEFINE_CALL 'DIAL NUMBER' { SEND_COMMAND TP,'TEXT6-DIALING...' (* INDICATE DIALING NUMBER *) IF (LENGTH_STRING(NUMBER1)) (* IF THERE IS A NUMBER 1 *) { (* AND IF THERE IS A NUMBER 2 *) IF (LENGTH_STRING(NUMBER2)) (* DIAL BOTH *) CALL 'COMMAND' (CODEC,"'lde',NUMBER1,$FE,NUMBER2,$FF") ELSE (* ELSE JUST DIAL NUMBER 1 *) CALL 'COMMAND' (CODEC,"'lde',NUMBER1,$FF") } ELSE IF (LENGTH_STRING(NUMBER2)) (* IF JUST NUMBER 2, DIAL IT *) CALL 'COMMAND' (CODEC,"'lde',NUMBER2,$FF") ELSE CALL 'CLEAR WINDOW' } (********************************) (* FUNCTION NAME: BEGIN WINDOW *) (* PURPOSE: SETS UP DIALING *) (* WINDOW *) (********************************) DEFINE_CALL 'BEGIN WINDOW' { SEND_COMMAND TP,'ICON7-5' (* SET UP TEXT AND BORDERS *) SEND_COMMAND TP,'ICON3-6' (* FOR DIALING NUMBER 1 *) SEND_COMMAND TP,'ICON8-6' SEND_COMMAND TP,'ICON9-6' SEND_COMMAND TP,'TEXT8-SPEED|DIAL' SEND_COMMAND TP,'TEXT9-ENTER' IF (!SPEED_STATE) { SEND_COMMAND TP,'TEXT2-ENTER FIRST NUMBER:' WAIT_UNTIL (ENTER_HIT) 'MANUAL 1' (* WHEN ENTER IS HIT *) { OFF [NUM1_STATE] (* NO LONGER ENTERING NUMBER 1 *) ON [NUM2_STATE] (* NOW ENTERING NUMBER 2 *) OFF [ENTER_HIT] (* TURN OFF ENTER HIT FLAG *) SEND_COMMAND TP,'ICON5-6' (* SET UP TEXT AND BORDERS *) SEND_COMMAND TP,'TEXT4-ENTER SECOND NUMBER:' WAIT_UNTIL (ENTER_HIT) 'MANUAL 2' (* WHEN ENTER IS HIT *) { OFF [NUM2_STATE] (* NO LONGER ENTERING NUMBER 2 *) OFF [ENTER_HIT] (* TURN OFF ENTER HIT FLAG *) CALL 'DIAL NUMBER' (* DIAL THE NUMBER(S) *) } } } ELSE { SEND_COMMAND TP,'TEXT2-ENTER SPEED NUMBER:' WAIT_UNTIL (ENTER_HIT) 'SPEED' (* WHEN ENTER IS HIT *) { OFF [ENTER_HIT] (* TURN OFF ENTER HIT FLAG *) CALL 'SPEED DIAL' (* SPEED DIAL THE NUMBER *) } } } (********************************) (* FUNCTION NAME: TILT UP *) (* PURPOSE: SENDS CONTINUE *) (* TILT UP COMMAND *) (* EVERY 0.5 SEC WHEN *) (* TILT UP IS ENGAGED *) (********************************) DEFINE_CALL 'TILT UP' ( ADDR (* CAMERA ADDRESS *) ) { WAIT 5 'TILT UP WAIT' IF ((ADDR = $F2) || (ADDR = $F3)) CALL 'COMMAND' (CODEC,"'ckc',ADDR,'atu'") ELSE IF (ADDR = $F1) CALL 'COMMAND' (CODEC,"'3kc',ADDR,'atu'") } (**********************************) (* FUNCTION NAME: TILT DOWN *) (* PURPOSE: SENDS CONTINUE *) (* TILT DOWN COMMMAND *) (* EVERY 0.5 SEC WHEN *) (* TILT DOWN IS ENGAGED *) (**********************************) DEFINE_CALL 'TILT DOWN' ( ADDR (* CAMERA ADDRESS *) ) { WAIT 5 'TILT DOWN WAIT' IF ((ADDR = $F2) || (ADDR = $F3)) CALL 'COMMAND' (CODEC,"'ckc',ADDR,'atd'") ELSE IF (ADDR = $F1) CALL 'COMMAND' (CODEC,"'3kc',ADDR,'atd'") } (*********************************) (* FUNCTION NAME: PAN LEFT *) (* PURPOSE: SENDS CONTINUE *) (* PAN LEFT COMMAND *) (* EVERY 0.5 SEC WHEN *) (* PAN LEFT IS ENGAGED *) (*********************************) DEFINE_CALL 'PAN LEFT' ( ADDR (* CAMERA ADDRESS *) ) { WAIT 5 'PAN LEFT WAIT' IF ((ADDR = $F2) || (ADDR = $F3)) CALL 'COMMAND' (CODEC,"'ckc',ADDR,'apl'") ELSE IF (ADDR = $F1) CALL 'COMMAND' (CODEC,"'3kc',ADDR,'apl'") } (**********************************) (* FUNCTION NAME: PAN RIGHT *) (* PURPOSE: SENDS CONTINUE *) (* PAN RIGHT COMMAND *) (* EVERY 0.5 SEC WHEN *) (* PAN RIGHT IS ENGAGED *) (**********************************) DEFINE_CALL 'PAN RIGHT' ( ADDR (* CAMERA ADDRESS *) ) { WAIT 5 'PAN RIGHT WAIT' IF ((ADDR = $F2) || (ADDR = $F3)) CALL 'COMMAND' (CODEC,"'ckc',ADDR,'apr'") ELSE IF (ADDR = $F1) CALL 'COMMAND' (CODEC,"'3kc',ADDR,'apr'") } (********************************) (* FUNCTION NAME: ZOOM IN *) (* PURPOSE: SENDS CONTINUE *) (* ZOOM IN COMMAND *) (* EVERY 0.5 SEC WHEN *) (* ZOOM IN IS ENGAGED *) (********************************) DEFINE_CALL 'ZOOM IN' ( ADDR (* CAMERA ADDRESS *) ) { WAIT 5 'ZOOM IN WAIT' IF ((ADDR = $F2) || (ADDR = $F3)) CALL 'COMMAND' (CODEC,"'ckc',ADDR,'azi'") ELSE IF (ADDR = $F1) CALL 'COMMAND' (CODEC,"'3kc',ADDR,'azi'") } (*********************************) (* FUNCTION NAME: ZOOM OUT *) (* PURPOSE: SENDS CONTINUE *) (* ZOOM OUT COMMAND *) (* EVERY 0.5 SEC WHEN *) (* ZOOM OUT IS ENGAGED *) (*********************************) DEFINE_CALL 'ZOOM OUT' ( ADDR (* CAMERA ADDRESS *) ) { WAIT 5 'ZOOM OUT WAIT' IF ((ADDR = $F2) || (ADDR = $F3)) CALL 'COMMAND' (CODEC,"'ckc',ADDR,'azo'") ELSE IF (ADDR = $F1) CALL 'COMMAND' (CODEC,"'3kc',ADDR,'azo'") } (**********************************) (* FUNCTION NAME: VOLUME UP *) (* PURPOSE: SENDS CONTINUE *) (* VOLUME UP COMMAND *) (* EVERY 0.5 SEC WHEN *) (* VOLUME UP IS ENGAGED *) (**********************************) DEFINE_CALL 'VOLUME UP' { WAIT 5 'VOLUME UP WAIT' CALL 'COMMAND' (CODEC,"'mavBcu'") } (************************************) (* FUNCTION NAME: VOLUME DOWN *) (* PURPOSE: SENDS CONTINUE *) (* VOLUME DOWN COMMAND *) (* EVERY 0.5 SEC WHEN *) (* VOLUME DOWN IS ENGAGED *) (************************************) DEFINE_CALL 'VOLUME DOWN' { WAIT 5 'VOLUME DOWN WAIT' CALL 'COMMAND' (CODEC,"'mavBcd'") } (***********************************************************) (* STARTUP CODE GOES BELOW *) (***********************************************************) DEFINE_START ON [NEAR_MODE] (* CONTROLLING NEAR END *) LOCAL_CAM = $F2 (* LOCAL CAMERA IS MAIN *) CURRENT_CAM = $F2 (* CONTROL MAIN CAM *) DISPLAY = 1 (* DEFAULT TO FAR END *) SEND_VID = 1 (* DEFAULT TO MAIN CAM *) ON [POWER_STATUS] (* DEFAULT TO POWER ON *) OFF [MENU] (* DEFAULT MENU OFF *) OFF [MUTE] (* DEFAULT MUTE OFF *) ON [AUDIO_HOOK] (* ASSUME ON HOOK AT STARTUP *) ON [VIDEO_HOOK] (* ASSUME ON HOOK AT STARTUP *) OFF [IN_VID] (* ASSUME NOT IN VIDEO CALL *) OFF [IN_AUD] (* ASSUME NOT IN AUDIO CALL *) OFF [INCOMING_VIDEO] (* ASSUME NO INCOMING VID CALL *) OFF [INCOMING_AUDIO] (* ASSUME NO INCOMING AUD CALL *) SEND_COMMAND TP,'FONT1-1' (* SET UP VARIABLE TEXT FONTS *) SEND_COMMAND TP,'FONT2-2' SEND_COMMAND TP,'FONT3-2' SEND_COMMAND TP,'FONT4-2' SEND_COMMAND TP,'FONT5-2' SEND_COMMAND TP,'FONT6-2' SEND_COMMAND TP,'FONT7-2' SEND_COMMAND TP,'FONT8-2' SEND_COMMAND TP,'FONT9-1' CREATE_BUFFER CODEC,BUFFER (* CREATE STATUS BACK BUFFER *) CALL 'CLEAR WINDOW' (* CLEAR NUMBER ENTERING WINDOW *) QCOUNT = 0 (* CLEAR QCOUNT *) WAIT 300 'START TIME OUT' (* AFTER 30 SECONDS, TIME OUT *) { OFF [CODEC_LOCK] (* UNLOCK CODEC *) CANCEL_WAIT_UNTIL 'STOP REPLY' (* CANCEL WAIT UNTIL *) SEND_STRING CODEC,"$02,'lrc',$04" (* MAKE SURE CODEC IS STARTED *) SEND_STRING CODEC,"$02,'lvr',$04" (* SEND 'OK' *) } ON [CODEC_LOCK] (* LOCK CODEC *) SEND_STRING CODEC,"$02,'lps',$04" (* SEND TELECONF TO STOP STATE *) (* WAIT UNTIL STOP CONFIRMATION FROM CODEC *) WAIT_UNTIL (FIND_STRING(BUFFER,"$02,'aws',$04",1)) 'STOP REPLY' { SEND_COMMAND TP,'DBEEP' (* INFORM USER *) CLEAR_BUFFER BUFFER (* CLEAR BUFFER *) CANCEL_WAIT 'START TIME OUT' (* CANCEL QUEUED WAIT *) SEND_STRING CODEC,"$02,'lvr',$04" (* SEND 'OK' *) SEND_STRING CODEC,"$02,'lccd',$04" (* DIALED MODEM *) SEND_STRING CODEC,"$02,'lcU1',$04" (* ONE MONITOR *) SEND_STRING CODEC,"$02,'lctp',$04" (* POINT TO POINT *) SEND_STRING CODEC,"$02,'lcam',$04" (* MANUAL ANSWER *) SEND_STRING CODEC,"$02,'lcb002',$04" (* CONTROL PROTOCOL V2 *) SEND_STRING CODEC,"$02,'lrc',$04" (* START TELECONF AGAIN *) OFF [CODEC_LOCK] (* UNLOCK CODEC *) } (***********************************************************) (* THE ACTUAL PROGRAM GOES BELOW *) (***********************************************************) DEFINE_PROGRAM WAIT 3 FLASH1 = !FLASH1 (* TOGGLE FLASH VARIABLE *) WAIT 10 FLASH2 = !FLASH2 (* TOGGLE FLASH VARIABLE *) (***************************************) (* PICTURETEL SECTION *) (***************************************) (******************************) (* STATUS BACK SECTION *) (******************************) IF (LENGTH_STRING(BUFFER)) (* IF SOMETHING IS IN BUFFER *) SEND_STRING 0,"BUFFER,$0D,$0A" (* PRINT IT OUT *) IF (!CODEC_LOCK) (* IF CODEC NOT LOCKED *) { IF (LENGTH_STRING(BUFFER) > 3) (* SOMETHING IS IN THE BUFFER *) { (* ALLOW FOR TIME FOR BUFFER TO *) MSG = REMOVE_STRING(BUFFER,"$04",1) (* GET FIRST MESSAGE *) IF (FIND_STRING(MSG,"$02,'aw'",1)) (* IF A CODEC COMMAND *) SEND_STRING CODEC,"$02,'lvr',$04" (* SEND 'OK' TO CODEC *) SELECT { (* INCOMING VIDEO CALL MESSAGE *) ACTIVE (MSG = "$02,'awi',$04") : { ON [INCOMING_VIDEO] (* INDICATE INCOMING CALL *) CANCEL_WAIT 'INCOMING VID WAIT' (* CANCEL OFF INCOMING CALL *) WAIT 70 'INCOMING VID WAIT' (* AFTER 7 SEC OF NO MORE MSG *) OFF [INCOMING_VIDEO] (* NO LONGER HAVE INCOMING CALL *) } (* INCOMING AUDIO CALL MESSAGE *) ACTIVE (MSG = "$02,'awj',$04") : { ON [INCOMING_AUDIO] (* INDICATE INCOMING CALL *) CANCEL_WAIT 'INCOMING AUD WAIT' (* CANCEL OFF INCOMING CALL *) WAIT 70 'INCOMING AUD WAIT' (* AFTER 7 SEC OF NO MORE MSG *) OFF [INCOMING_AUDIO] (* NO LONGER HAVE INCOMING CALL *) } (* AUTO ANSWER AUDIO CALL MESSAGE *) ACTIVE (MSG = "$02,'awa',$04") : { ON [IN_AUD] (* INDICATE IN AUDIO CALL *) OFF [AUDIO_HOOK] (* UPDATE AUDIO HOOK FLAG *) } (* DISCONNECTED AUDIO CALL *) ACTIVE (MSG = "$02,'awh',$04") : { ON [AUDIO_HOOK] (* UPDATE AUDIO HOOK FLAG *) OFF [IN_AUD] (* UPDATE CALL IN PROGRESS *) } (* DISCONNECTED VIDEO CALL *) ACTIVE (MSG = "$02,'awd',$04") : { SEND_COMMAND TP,'DBEEP' (* SEND BEEP AND MESSAGE TO TP *) SEND_COMMAND TP,'TEXT6-CALL DISCONNECTED' NUMBER1 = '' (* CLEAR OUT NUMBER 1 *) NUMBER2 = '' (* CLEAR OUT NUMBER 2 *) OFF [NUM1_STATE] (* NO LONGER IN ANY *) OFF [NUM2_STATE] (* DIALING STATE *) OFF [SPEED_STATE] WAIT 20 'CLEAR WAIT' (* WAIT 2 SEC *) CALL 'CLEAR WINDOW' (* AND CLEAR DIALING WINDOW *) ON [VIDEO_HOOK] (* UPDATE VIDEO HOOK FLAG *) OFF [IN_VID] (* UPDATE CALL IN PROGRESS *) } (* CALL COMPLETED *) ACTIVE (MSG = "$02,'awc',$04") : { SEND_COMMAND TP,'DBEEP' (* SEND BEEP AND MESSAGE TO TP *) SEND_COMMAND TP,'TEXT6-CALL COMPLETED' SEND_COMMAND TP,'TEXT8-' (* CLEAR SPEED DIAL *) SEND_COMMAND TP,'ICON8-0' SEND_COMMAND TP,'TEXT9-' (* CLEAR ENTER *) SEND_COMMAND TP,'TEXT9-0' OFF [VIDEO_HOOK] (* UPDATE VIDEO HOOK FLAG *) ON [IN_VID] (* UPDATE CALL IN PROGRESS *) } (* RECEIVING A GRAPHIC *) ACTIVE (MSG = "$02,'awx',$04") : { CANCEL_WAIT 'GRAPHIC WAIT' SEND_COMMAND TP,'DBEEP' (* SEND BEEP AND MESSAGE TO TP *) SEND_COMMAND TP,'TEXT1-RECEIVING| GRAPHIC' WAIT 20 'GRAPHIC WAIT' SEND_COMMAND TP,'TEXT1-' } (* COMPLETED RECEIVING GRAPHIC *) ACTIVE (MSG = "$02,'awg',$04") : { CANCEL_WAIT 'GRAPHIC WAIT' SEND_COMMAND TP,'DBEEP' (* SEND BEEP AND MESSAGE TO TP *) SEND_COMMAND TP,'TEXT1-GRAPHIC|RECEIVED' WAIT 20 'GRAPHIC WAIT' SEND_COMMAND TP,'TEXT1-' } (* COMPLETED TRANSMITTING GRAPHIC *) ACTIVE (MSG = "$02,'awz',$04") : { CANCEL_WAIT 'GRAPHIC WAIT' SEND_COMMAND TP,'DBEEP' (* SEND BEEP AND MESSAGE TO TP *) SEND_COMMAND TP,'TEXT1- GRAPHIC|TRANSMITTED' WAIT 20 'GRAPHIC WAIT' SEND_COMMAND TP,'TEXT1-' } (* IN MENU MODE MESSAGE *) ACTIVE (MSG = "$02,'abSs',$04") : ON [MENU] (* UPDATE MENU FLAG *) (* NOT IN MENU MODE MESSAGE *) ACTIVE (MSG = "$02,'abSn',$04") : OFF [MENU] (* UPDATE MENU FLAG *) } SEND_STRING 0,"'PROCESSED - ',MSG,$0A,$0D" } } (******************************) (* POWER SECTION *) (******************************) PUSH[TP,25] (* POWER ON/OFF *) { TO [POWER_STATUS] (* TOGGLE POWER FLAG *) IF (POWER_STATUS) (* IF TURNING POWER ON *) { CALL 'COMMAND' (CODEC,"'loph'") (* TURN POWER ON *) DISPLAY = 1 (* DEFAULT TO FAR END *) SEND_VID = 1 (* DEFAULT TO MAIN CAMERA *) SEND_GPH = 0 (* NO SEND GRAPHICS *) } ELSE (* ELSE IF TURNING POWER OFF *) CALL 'COMMAND' (CODEC,"'lopl'") (* TURN POWER OFF *) } IF (POWER_STATUS) (* BTNS ACTIVE IF POWER IS ON *) { (******************************) (* CAMERA CONTROL SECTION *) (******************************) PUSH[TP,30] (* NEAR END *) { ON [NEAR_MODE] (* CONTROLLING NEAR END *) CURRENT_CAM = LOCAL_CAM (* LOCAL SELECTED CAMERA *) } PUSH[TP,50] (* FAR END *) { OFF [NEAR_MODE] (* CONTROLLING FAR END *) CURRENT_CAM = $F1 (* REMOTE SELECTED CAMERA *) } PUSH[TP,1] (* TILT UP *) { (* BEGIN TILTING UP *) IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckr',CURRENT_CAM,'atu075'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kr',CURRENT_CAM,'atu075'") CAM_PRESET[CURRENT_CAM - $F0] = 0 ON [TILT_UP] (* UPDATE TILT UP STATUS *) } PUSH[TP,2] (* TILT DOWN *) { (* BEGIN TILTING DOWN *) IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckr',CURRENT_CAM,'atd075'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kr',CURRENT_CAM,'atd075'") CAM_PRESET[CURRENT_CAM - $F0] = 0 ON [TILT_DOWN] (* UPDATE TILT DOWN STATUS *) } PUSH[TP,3] (* PAN LEFT *) { (* BEGIN PANNING LEFT *) IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckr',CURRENT_CAM,'apl075'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kr',CURRENT_CAM,'apl075'") CAM_PRESET[CURRENT_CAM - $F0] = 0 ON [PAN_LEFT] (* UPDATE PAN LEFT STATUS *) } PUSH[TP,4] (* PAN RIGHT *) { (* BEGIN PANNING RIGHT *) IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckr',CURRENT_CAM,'apr075'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kr',CURRENT_CAM,'apr075'") CAM_PRESET[CURRENT_CAM - $F0] = 0 ON [PAN_RIGHT] (* UPDATE PAN RIGHT STATUS *) } PUSH[TP,5] (* ZOOM IN *) { (* BEGIN ZOOMING IN *) IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckr',CURRENT_CAM,'azi075'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kr',CURRENT_CAM,'azi075'") CAM_PRESET[CURRENT_CAM - $F0] = 0 ON [ZOOM_IN] (* UPDATE ZOOM IN STATUS *) } PUSH[TP,6] (* ZOOM OUT *) { (* BEGIN ZOOMING OUT *) IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckr',CURRENT_CAM,'azo075'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kr',CURRENT_CAM,'azo075'") CAM_PRESET[CURRENT_CAM - $F0] = 0 ON [ZOOM_OUT] (* UPDATE ZOOM OUT STATUS *) } IF (TILT_UP) (* IF TILTING UP *) CALL 'TILT UP' (CURRENT_CAM) (* CONTINUE *) IF (TILT_DOWN) (* IF TILTING DOWN *) CALL 'TILT DOWN' (CURRENT_CAM) (* CONTINUE *) IF (PAN_LEFT) (* IF PANNING LEFT *) CALL 'PAN LEFT' (CURRENT_CAM) (* CONTINUE *) IF (PAN_RIGHT) (* IF PANNING RIGHT *) CALL 'PAN RIGHT' (CURRENT_CAM) (* CONTINUE *) IF (ZOOM_IN) (* IF ZOOMING IN *) CALL 'ZOOM IN' (CURRENT_CAM) (* CONTINUE *) IF (ZOOM_OUT) (* IF ZOOMING OUT *) CALL 'ZOOM OUT' (CURRENT_CAM) (* CONTINUE *) RELEASE[TP,1] (* TILT UP *) { (* STOP TILTING UP *) CANCEL_WAIT 'TILT UP WAIT' IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckp',CURRENT_CAM,'atu'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kp',CURRENT_CAM,'atu'") OFF [TILT_UP] (* UPDATE TILT UP STATUS *) } RELEASE[TP,2] (* TILT DOWN *) { (* STOP TILTING DOWN *) CANCEL_WAIT 'TILT DOWN WAIT' IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckp',CURRENT_CAM,'atd'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kp',CURRENT_CAM,'atd'") OFF [TILT_DOWN] (* UPDATE TILT DOWN STATUS *) } RELEASE[TP,3] (* PAN LEFT *) { (* STOP PANNING LEFT *) CANCEL_WAIT 'PAN LEFT WAIT' IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckp',CURRENT_CAM,'apl'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kp',CURRENT_CAM,'apl'") OFF [PAN_LEFT] (* UDPATE PAN LEFT STATUS *) } RELEASE[TP,4] (* PAN RIGHT *) { (* STOP PANNING RIGHT *) CANCEL_WAIT 'PAN RIGHT WAIT' IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckp',CURRENT_CAM,'apr'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kp',CURRENT_CAM,'apr'") OFF [PAN_RIGHT] (* UPDATE PAN RIGHT STATUS *) } RELEASE[TP,5] (* ZOOM IN *) { (* STOP ZOOMING IN *) CANCEL_WAIT 'ZOOM IN WAIT' IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckp',CURRENT_CAM,'azi'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kp',CURRENT_CAM,'azi'") OFF [ZOOM_IN] (* UPDATE ZOOM IN STATUS *) } RELEASE[TP,6] (* ZOOM OUT *) { (* STOP ZOOMING OUT *) CANCEL_WAIT 'ZOOM OUT WAIT' IF ((CURRENT_CAM = $F2) || (CURRENT_CAM = $F3)) CALL 'COMMAND' (CODEC,"'ckp',CURRENT_CAM,'azo'") ELSE IF (CURRENT_CAM = $F1) CALL 'COMMAND' (CODEC,"'3kp',CURRENT_CAM,'azo'") OFF [ZOOM_OUT] (* UPDATE ZOOM OUT STATUS *) } PUSH[TP,7] (* STORE PRESET *) TO [STORE_PRESET] (* TOGGLE STORE PRESET VARIABLE *) PUSH[TP,8] (* PRESET 1 *) PUSH[TP,9] (* PRESET 2 *) PUSH[TP,10] (* PRESET 3 *) PUSH[TP,11] (* PRESET 4 *) { TEMP_PRESET = PUSH_CHANNEL - 7 (* UPDATE CAMERA PRESET *) IF (STORE_PRESET) (* IF STORE PRESET *) { (* STORE CURRENT CAM PSTN *) CAM_MATRIX[TEMP_PRESET] = CURRENT_CAM SELECT { (* CURRENT CAMERA IS FAR END *) ACTIVE (CURRENT_CAM = $F1) : { CALL 'COMMAND' (CODEC,"'3ks',CURRENT_CAM,'0',ITOA(TEMP_PRESET-1)") CAM_PRESET[1] = TEMP_PRESET } (* CURRENT CAMERA IS MAIN *) ACTIVE (CURRENT_CAM = $F2) : { CALL 'COMMAND' (CODEC,"'cks',CURRENT_CAM,'0',ITOA(TEMP_PRESET-1)") CAM_PRESET[2] = TEMP_PRESET } (* CURRENT CAMERA IS AUX *) ACTIVE (CURRENT_CAM = $F3) : { CALL 'COMMAND' (CODEC,"'cks',CURRENT_CAM,'0',ITOA(TEMP_PRESET+3)") CAM_PRESET[3] = TEMP_PRESET + 4 } } OFF [STORE_PRESET] } ELSE (* ELSE RECALL PRESET 1 *) { IF (CAM_MATRIX[TEMP_PRESET] <> $F1) SEND_VID = CAM_MATRIX[TEMP_PRESET] - $F1 SELECT { (* CURRENT CAMERA IS FAR END *) ACTIVE (CURRENT_CAM = $F1) : { CALL 'COMMAND' (CODEC,"'3kg0',ITOA(TEMP_PRESET-1),'s'") CAM_PRESET[1] = TEMP_PRESET } (* CURRENT CAMERA IS MAIN *) ACTIVE (CURRENT_CAM = $F2) : { CALL 'COMMAND' (CODEC,"'ckg0',ITOA(TEMP_PRESET-1),'s'") CAM_PRESET[2] = TEMP_PRESET } (* CURRENT CAMERA IS AUX *) ACTIVE (CURRENT_CAM = $F3) : { CALL 'COMMAND' (CODEC,"'ckg0',ITOA(TEMP_PRESET+3),'s'") CAM_PRESET[3] = TEMP_PRESET + 4 } } } } (******************************) (* DISPLAY SELECTION SECTION *) (******************************) PUSH[TP,12] (* FAR END *) { SELECT { ACTIVE (SEND_VID = 1) : (* IF WAS SENDING MAIN CAM *) CALL 'COMMAND' (CODEC,"'mfmcG'") (* SWITCH IT TO PIP *) ACTIVE (SEND_VID = 2) : (* IF WAS SENDING AUX VIDEO *) CALL 'COMMAND' (CODEC,"'mfmdG'") (* SWITCH IT TO PIP *) ACTIVE (SEND_VID = 3) : (* IF WAS SENDING VCR *) CALL 'COMMAND' (CODEC,"'mfmeG'") (* SWITCH IT TO PIP *) ACTIVE (SEND_VID = 4) : (* IF WAS SENDING DOC CAMERA *) CALL 'COMMAND' (CODEC,"'mfmfG'") (* SWITCH IT TO PIP *) } DISPLAY = 1 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmaB'") (* DO SWITCH *) } PUSH[TP,13] (* MAIN CAMERA *) { LOCAL_CAM = $F2 CURRENT_CAM = LOCAL_CAM IF (DISPLAY = 1) (* IF WAS DISPLAYING FAR END *) CALL 'COMMAND' (CODEC,"'mfmaG'") (* SWITCH IT TO PIP *) DISPLAY = 2 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmcB'") (* DO SWITCH *) } PUSH[TP,14] (* AUX VIDEO *) { LOCAL_CAM = $F3 CURRENT_CAM = LOCAL_CAM IF (DISPLAY = 1) (* IF WAS DISPLAYING FAR END *) CALL 'COMMAND' (CODEC,"'mfmaG'") (* SWITCH IT TO PIP *) DISPLAY = 3 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmdB'") (* DO SWITCH *) } PUSH[TP,15] (* VCR *) { IF (DISPLAY = 1) (* IF WAS DISPLAYING FAR END *) CALL 'COMMAND' (CODEC,"'mfmaG'") (* SWITCH IT TO PIP *) DISPLAY = 4 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmeB'") (* DO SWITCH *) } PUSH[TP,16] (* DOC CAMERA *) { IF (DISPLAY = 1) (* IF WAS DISPLAYING FAR END *) CALL 'COMMAND' (CODEC,"'mfmaG'") (* SWITCH IT TO PIP *) DISPLAY = 5 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmfB'") (* DO SWITCH *) } PUSH[TP,17] (* AUX GRAPHICS *) { IF (DISPLAY = 1) (* IF WAS DISPLAYING FAR END *) CALL 'COMMAND' (CODEC,"'mfmaG'") (* SWITCH IT TO PIP *) DISPLAY = 6 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmgB'") (* DO SWITCH *) } PUSH[TP,18] (* STORED GRAPHICS *) { IF (DISPLAY = 1) (* IF WAS DISPLAYING FAR END *) CALL 'COMMAND' (CODEC,"'mfmaG'") (* SWITCH IT TO PIP *) DISPLAY = 7 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmhB'") (* DO SWITCH *) } (******************************) (* SEND VIDEO SECTION *) (******************************) PUSH[TP,19] (* MAIN CAM *) { SEND_VID = 1 (* UPDATE SEND VIDEO *) CALL 'COMMAND' (CODEC,"'mfmcC'") (* DO SEND SWITCH *) CALL 'COMMAND' (CODEC,"'mfmcG'") (* DO PIP SWITCH *) } PUSH[TP,20] (* AUX VIDEO *) { SEND_VID = 2 (* UPDATE SEND VIDEO *) CALL 'COMMAND' (CODEC,"'mfmdC'") (* DO SEND SWITCH *) CALL 'COMMAND' (CODEC,"'mfmdG'") (* DO PIP SWITCH *) } PUSH[TP,21] (* VCR *) { SEND_VID = 3 (* UPDATE SEND VIDEO *) CALL 'COMMAND' (CODEC,"'mfmeC'") (* DO SEND SWITCH *) CALL 'COMMAND' (CODEC,"'mfmeG'") (* DO PIP SWITCH *) } PUSH[TP,45] (* DOC CAMERA *) { SEND_VID = 4 (* UPDATE SEND VIDEO *) CALL 'COMMAND' (CODEC,"'mfmfC'") (* DO SEND SWITCH *) CALL 'COMMAND' (CODEC,"'mfmfG'") (* DO PIP SWITCH *) } (******************************) (* SEND GRAPHICS SECTION *) (******************************) PUSH[TP,23] (* DOC CAMERA *) { SEND_GPH = 1 (* UPDATE SEND GRAPHICS *) SEND_COMMAND TP,'TEXT1-SENDING|GRAPHICS' (* SEND MESSAGE TO TP *) WAIT 20 SEND_COMMAND TP,'TEXT1-' (* CLEAR MESSAGE *) CALL 'COMMAND' (CODEC,"'mfsyfD'") (* DO SEND SWITCH *) CALL 'COMMAND' (CODEC,"'mfmfG'") (* DO PIP SWITCH *) } PUSH[TP,24] (* AUX GRAPHICS *) { SEND_GPH = 2 (* UPDATE SEND GRAPHICS *) SEND_COMMAND TP,'TEXT1-SENDING|GRAPHICS' (* SEND MESSAGE TO TP *) WAIT 20 SEND_COMMAND TP,'TEXT1-' (* CLEAR MESSAGE *) CALL 'COMMAND' (CODEC,"'mfsygD'") (* DO SEND SWITCH *) CALL 'COMMAND' (CODEC,"'mfmgG'") (* DO PIP SWITCH *) } (******************************) (* VIDEO EFFECTS SECTION *) (******************************) PUSH[TP,26] (* WINDOW *) CALL 'COMMAND' (CODEC,"'mbwt'") (******************************) (* PHONE CONTROL SECTION *) (******************************) PUSH[TP,28] (* AUDIO CALL *) { IF ((VIDEO_HOOK) || (* IF VIDEO ON HOOK *) ((!VIDEO_HOOK) && IN_VID)) (* IF VIDEO CALL IS IN PROGRESS *) { CANCEL_WAIT 'INCOMING AUD WAIT' (* CANCEL WAIT *) TO [AUDIO_HOOK] IF (!AUDIO_HOOK) (* IF AUDIO IS OFF HOOK *) { IF (INCOMING_AUDIO) (* IF CALL IS COMING IN *) { CANCEL_WAIT 'AUDIO TIME OUT' (* CANCEL QUEUED WAIT *) ON [IN_AUD] (* INDICATE IN AUDIO CALL *) OFF [INCOMING_AUDIO] (* UPDATE INCOMING AUDIO FLAG *) } ELSE { CANCEL_WAIT 'AUDIO TIME OUT' (* CANCEL QUEUED WAIT *) WAIT CALL_TIME 'AUDIO TIME OUT' (* WAIT AND ASSUME IN CALL *) ON [IN_AUD] (* UPDATE AUDIO CALL FLAG *) } CALL 'COMMAND' (CODEC,"'lao'") (* TAKE IT OFF HOOK *) } ELSE { OFF [IN_AUD] (* UPDATE INCOMING AUDIO FLAG *) CANCEL_WAIT 'AUDIO TIME OUT' (* CANCEL QUEUED WAIT *) CALL 'COMMAND' (CODEC,"'lad'") (* PUT IT ON HOOK *) } } ELSE (* ELSE IF VIDEO OFF HOOK *) SEND_COMMAND TP,'DBEEP' (* GIVE USER RASPBERRY *) } PUSH[TP,22] (* # *) PUSH[TP,29] (* * *) PUSH[TP,35] (* 0 *) PUSH[TP,36] (* 1 *) PUSH[TP,37] (* 2 *) PUSH[TP,38] (* 3 *) PUSH[TP,39] (* 4 *) PUSH[TP,40] (* 5 *) PUSH[TP,41] (* 6 *) PUSH[TP,42] (* 7 *) PUSH[TP,43] (* 8 *) PUSH[TP,44] (* 9 *) { TO [TP,PUSH_CHANNEL] IF (!(AUDIO_HOOK || IN_AUD)) (* IF PLACING AUDIO CALL *) { CANCEL_WAIT 'AUDIO TIME OUT' (* CANCEL QUEUED WAIT *) WAIT CALL_TIME 'AUDIO TIME OUT' (* WAIT AND ASSUME IN CALL *) ON [IN_AUD] (* ASSUME IN CALL *) CALL 'COMMAND' (CODEC,"'lam',PUSH_CHANNEL+13") } ELSE IF (!(VIDEO_HOOK || IN_VID)) (* ELSE IF PLACING VIDEO CALL *) CALL 'ENTER NUMBER' (PUSH_CHANNEL+13) (* ENTER NUMBER *) ELSE (* ELSE *) CALL 'COMMAND' (CODEC,"'loa',PUSH_CHANNEL+13") } PUSH[TP,54] (* BACKSPACE *) CALL 'REMOVE NUMBER' PUSH[TP,27] (* VIDEO CALL *) { IF ((AUDIO_HOOK) || (* IF AUDIO ON HOOK *) ((!AUDIO_HOOK) && IN_AUD)) (* IF AUDIO CALL IN PROGRESS *) { CANCEL_WAIT 'INCOMING VID WAIT' (* CANCEL WAIT *) CANCEL_WAIT_UNTIL 'MANUAL 1' (* CANCEL QUEUED WAITS *) CANCEL_WAIT_UNTIL 'MANUAL 2' CANCEL_WAIT_UNTIL 'SPEED' CANCEL_WAIT 'CLEAR WAIT' NUMBER1 = '' (* CLEAR PHONE NUMBER 1 *) NUMBER2 = '' (* CLEAR PHONE NUMBER 2 *) TO [VIDEO_HOOK] IF (!VIDEO_HOOK) (* IF OFF HOOK *) { IF (INCOMING_VIDEO) (* IF INCOMING CALL *) { ON [IN_VID] (* INDICATE IN VIDEO CALL *) OFF [INCOMING_VIDEO] (* UPDATE INCOMING VIDEO FLAG *) CALL 'COMMAND' (CODEC,"'ldo'") (* TAKE OFF HOOK *) } ELSE (* IF PLACING VIDEO CALL *) { ON [NUM1_STATE] CALL 'BEGIN WINDOW' CALL 'COMMAND' (CODEC,"'ldo'") (* TAKE OFF HOOK *) } } ELSE (* ELSE IF OFF HOOK *) { OFF [IN_VID] (* CALL NOT IN PROGRESS *) OFF [NUM1_STATE] (* NOT IN NUMBER 1 *) OFF [NUM2_STATE] (* NOT IN NUMBER 2 *) OFF [SPEED_STATE] (* NOT IN SPEED DIAL *) CALL 'COMMAND' (CODEC,"'ldd'") (* PUT ON HOOK *) CALL 'CLEAR WINDOW' } } ELSE (* OTHERWISE *) SEND_COMMAND TP,'DBEEP' (* GIVE USER RASPBERRY *) } IF (!(VIDEO_HOOK || IN_VID)) (* IF PLACING VIDEO CALL *) { PUSH[TP,46] (* SPEED DIAL *) { TO [TP,46] ON [SPEED_STATE] (* IN SPEED DIAL *) OFF [NUM1_STATE] (* NOT IN NUMBER 1 *) OFF [NUM2_STATE] (* NOT IN NUMBER 2 *) CANCEL_WAIT_UNTIL 'MANUAL 1' (* CANCEL QUEUED WAITS *) CANCEL_WAIT_UNTIL 'MANUAL 2' CANCEL_WAIT_UNTIL 'SPEED' NUMBER1 = '' (* CLEAR NUMBER 1 *) NUMBER2 = '' (* CLEAR NUMBER 2 *) CALL 'BEGIN WINDOW' (* PULL UP WINDOWS *) } PUSH[TP,34] (* CALL ENTER *) { TO [TP,34] (* FEEDBACK *) ON [ENTER_HIT] (* TURN ON ENTER HIT FLAG *) } } PUSH[TP,31] (* MENU *) { TO [TP,31] (* FEEDBACK *) SELECT { ACTIVE (SEND_VID = 1) : (* IF WAS SENDING MAIN CAM *) CALL 'COMMAND' (CODEC,"'mfmcG'") (* SWITCH IT TO PIP *) ACTIVE (SEND_VID = 2) : (* IF WAS SENDING AUX VIDEO *) CALL 'COMMAND' (CODEC,"'mfmdG'") (* SWITCH IT TO PIP *) ACTIVE (SEND_VID = 3) : (* IF WAS SENDING VCR *) CALL 'COMMAND' (CODEC,"'mfmeG'") (* SWITCH IT TO PIP *) ACTIVE (SEND_VID = 4) : (* IF WAS SENDING DOC CAMERA *) CALL 'COMMAND' (CODEC,"'mfmfG'") (* SWITCH IT TO PIP *) } DISPLAY = 1 (* UPDATE DISPLAY *) CALL 'COMMAND' (CODEC,"'mfmaB'") (* DO SWITCH *) IF (!MENU) (* IF MENU IS NOT DISPLAYED *) { CALL 'COMMAND' (CODEC,"'loss'") (* DISPLAY SET UP MENU *) CALL 'COMMAND' (CODEC,"'lqS'") (* REQUEST SET UP MENU STATUS *) } ELSE { CALL 'COMMAND' (CODEC,"'loa',$0D") (* SEND ASCII ENTER *) CALL 'COMMAND' (CODEC,"'lqS'") (* REQUEST SET UP MENU STATUS *) } } PUSH[TP,32] (* UP *) CALL 'COMMAND' (CODEC,"'loa',$18") (* SEND ASCII CURSOR UP *) PUSH[TP,33] (* DOWN *) CALL 'COMMAND' (CODEC,"'loa',$19") (* SEND ASCII CURSOR DOWN *) PUSH[TP,51] (* LEFT *) CALL 'COMMAND' (CODEC,"'loa',$1B") (* SEND ASCII CURSOR LEFT *) PUSH[TP,52] (* RIGHT *) CALL 'COMMAND' (CODEC,"'loa',$1A") (* SEND ASCII CURSOR RIGHT *) PUSH[TP,53] (* MENU ENTER *) { CALL 'COMMAND' (CODEC,"'loa',$0D") (* SEND ASCII ENTER *) CALL 'COMMAND' (CODEC,"'lqS'") (* REQUEST SET UP MENU STATUS *) } PUSH[TP,47] (* MUTE *) { TO [MUTE] IF (MUTE) (* IF MUTING *) CALL 'COMMAND' (CODEC,"'mavbm'") ELSE (* ELSE IF UNMUTING *) CALL 'COMMAND' (CODEC,"'mavbu'") } PUSH[TP,48] (* VOLUME UP *) { ON [VOLUME_UP] (* UPDATE VOLUME UP *) CALL 'COMMAND' (CODEC,"'mavBru'") (* START RAMPING VOLUME UP *) } PUSH[TP,49] (* VOLUME DOWN *) { ON [VOLUME_DN] (* UPDATE VOLUME DOWN *) CALL 'COMMAND' (CODEC,"'mavBrd'") (* START RAMPING VOLUME DOWN *) } IF (VOLUME_UP) (* IF RAMPING VOLUME UP *) CALL 'VOLUME UP' (* CONTINUE *) IF (VOLUME_DN) (* IF RAMPING VOLUME DOWN *) CALL 'VOLUME DOWN' (* CONTINUE *) RELEASE[TP,48] (* VOLUME UP *) { OFF [VOLUME_UP] (* UPDATE VOLUME UP *) CANCEL_WAIT 'VOLUME UP WAIT' (* STOP RAMPING VOLUME *) CALL 'COMMAND' (CODEC,"'mavBpu'") } RELEASE[TP,49] (* VOLUME DOWN *) { OFF [VOLUME_DN] (* UPDATE VOLUME DOWN *) CANCEL_WAIT 'VOLUME DOWN WAIT' (* STOP RAMPING VOLUME *) CALL 'COMMAND' (CODEC,"'mavBpd'") } } IF (QCOUNT && (!CODEC_LOCK)) (* IF SOMETHING IS IN QUEUE *) { CALL 'REMOVE QUEUE' (PCOM) (* REMOVE FIRST ITEM *) CALL 'COMMAND' (CODEC,PCOM) (* EXECUTE COMMAND *) } (******************************) (* FEEDBACK SECTION *) (******************************) [TP,7] = (STORE_PRESET && POWER_STATUS) (* STORE PRESET *) [TP,8] = (((CAM_PRESET[1] = 1) && (CURRENT_CAM = $F1)) || (* PRESET 1 *) ((CAM_PRESET[2] = 1) && (CURRENT_CAM = $F2)) || ((CAM_PRESET[3] = 5) && (CURRENT_CAM = $F3))) && POWER_STATUS [TP,9] = (((CAM_PRESET[1] = 2) && (CURRENT_CAM = $F1)) || (* PRESET 2 *) ((CAM_PRESET[2] = 2) && (CURRENT_CAM = $F2)) || ((CAM_PRESET[3] = 6) && (CURRENT_CAM = $F3))) && POWER_STATUS [TP,10] = (((CAM_PRESET[1] = 3) && (CURRENT_CAM = $F1)) || (* PRESET 3 *) ((CAM_PRESET[2] = 3) && (CURRENT_CAM = $F2)) || ((CAM_PRESET[3] = 7) && (CURRENT_CAM = $F3))) && POWER_STATUS [TP,11] = (((CAM_PRESET[1] = 4) && (CURRENT_CAM = $F1)) || (* PRESET 4 *) ((CAM_PRESET[2] = 4) && (CURRENT_CAM = $F2)) || ((CAM_PRESET[3] = 8) && (CURRENT_CAM = $F3))) && POWER_STATUS [TP,30] = (NEAR_MODE && POWER_STATUS) (* NEAR END CNTL *) [TP,50] = ((!NEAR_MODE) && POWER_STATUS) (* FAR END CNTL *) [TP,12] = ((DISPLAY = 1) && POWER_STATUS) (* FAR END *) [TP,13] = ((DISPLAY = 2) && POWER_STATUS) (* MAIN CAM *) [TP,14] = ((DISPLAY = 3) && POWER_STATUS) (* AUX VIDEO *) [TP,15] = ((DISPLAY = 4) && POWER_STATUS) (* VCR *) [TP,16] = ((DISPLAY = 5) && POWER_STATUS) (* DOC CAMERA *) [TP,17] = ((DISPLAY = 6) && POWER_STATUS) (* AUX GRAPHICS *) [TP,18] = ((DISPLAY = 7) && POWER_STATUS) (* STORED GRHICS *) [TP,19] = ((SEND_VID = 1) && POWER_STATUS) (* MAIN CAM *) [TP,20] = ((SEND_VID = 2) && POWER_STATUS) (* AUX VID *) [TP,21] = ((SEND_VID = 3) && POWER_STATUS) (* VCR *) [TP,45] = ((SEND_VID = 4) && POWER_STATUS) (* DOC CAMERA *) [TP,23] = ((SEND_GPH = 1) && POWER_STATUS) (* DOC CAMERA *) [TP,24] = ((SEND_GPH = 2) && POWER_STATUS) (* AUX GRHICS *) [TP,25] = (POWER_STATUS) (* ON/OFF *) [TP,27] = ((!(VIDEO_HOOK || IN_VID)) && FLASH1) || (* VIDEO HOOK *) (INCOMING_VIDEO && FLASH2) || IN_VID [TP,28] = ((!(AUDIO_HOOK || IN_AUD)) && FLASH1) || (* AUDIO HOOK *) (INCOMING_AUDIO && FLASH2)|| IN_AUD [TP,47] = (MUTE) (* MUTE/PRIVACY *) (***********************************************************) (* END OF PROGRAM *) (* DO NOT PUT ANY CODE BELOW THIS COMMENT *) (***********************************************************)