background image

instruction manual

Software

Axcess 

Programming Language

Summary of Contents for Axcess

Page 1: ...instruction manual Software Axcess Programming Language ...

Page 2: ... liability applies whether damages are sought or a claim is made under this warranty or as a tort claim including negligence and strict product liability a contract claim or any other claim This limitation of liability cannot be waived or amended by any person This limitation of liability will be effective even if AMX Corporation or an authorized representative of AMX Corporation has been advised ...

Page 3: ...ions 9 Starting a new program 9 DEFINE_DEVICE 9 DEFINE_CONSTANT 10 DEFINE_VARIABLE 11 DEFINE_LATCHING 11 DEFINE_MUTUALLY_EXCLUSIVE 12 DEFINE_START 12 DEFINE_PROGRAM 12 PROGRAM_NAME 13 Using Input and Output 15 Channels 15 Input Change Keywords 15 Changing the State of a Channel 16 Output Change Keywords 16 Direct Assignment 18 Putting Input and Output Together 18 Channel Characteristics 19 Parts o...

Page 4: ...le Program 28 Arrays and Strings 31 Defining Arrays 31 Accessing and Storing Array Values 31 Strings 33 String literals 33 String expressions 33 Arrays as Strings 34 String Lengths 34 Array Manipulation Keywords 36 Uppercase vs Lowercase 38 Setting uppercase and lowercase 38 Sending Strings 39 Array Keywords 39 String Keywords 40 Levels 41 Introduction to Levels 41 Creating Levels 41 Level Keyword...

Page 5: ...s 59 Retrieving values 60 IF and the Boolean Expressions 63 Boolean Expressions 63 The IF Statement 64 The IF ELSE Set of Statements 64 The IF ELSE IF Set of Statements 64 Nesting 64 The SELECT ACTIVE Statement 65 More Boolean operators 66 Reading a Boolean expression table 66 Boolean Keywords 67 While Keywords 69 WHILE 69 MEDIUM_WHILE 69 LONG_WHILE 69 While Keywords 70 Using Buffers 73 Communicat...

Page 6: ...ubroutines 89 Local Variables and Parameters 90 Local Variables 90 Parameters 90 Passing values back to the caller 91 Local Variables and Parameter Keywords 93 Include Files and System_Calls 95 Managing Large Programs 95 Include files 95 System_Calls and Library files 96 Factory System_Calls 97 Pre Processor Statements 101 Debugging 103 Types of Errors 103 Compilation Errors and Warnings 103 Run T...

Page 7: ...ess 114 External_Control 115 Appendix 117 Axcess Programming Standards 117 Axcess Keywords 126 ASCII Code Chart 127 Hexadecimal Chart Abbreviations 128 Accessing the AMX BBS 129 About Worldgroup Manager 129 Installing Worldgroup Manager 129 Adding the AMX BBS to the Worldgroup Manager 129 ...

Page 8: ...vi Axcess Programming Language Table of Contents ...

Page 9: ...from 1 to 255 designating each device connected to Axcess via AXlink Each device on AXlink must have a unique device number For Axcess CardFrames the device number of a card is set by the slot number and the DIP switch setting on the Server Card For box devices the address is set with a DIP switch on the device itself The DIP switch on the Server Card sets the address of the card in slot 1 For exa...

Page 10: ...he 9 pin connector on the Central Controller The following table lists solutions to some common communication problems If the Central Controller is in slot MC1 the 9 pin connector on the back of the CardFrame can be used Communications Problem Resolutions Cause Resolution The baud rate of the Axcess Control System is different than that of the Central Controller The Axcess Control System baud rate...

Page 11: ...ks per second Indicates the devices specified in the program do not match the devices found on AXlink For a full description refer to the Compare current devices option in the Diagnostics Menu section of this man ual Three blinks per second Indicates there is an AXlink communications error probably due to a wiring problem Check all the Axcess wiring making sure each cable is firmly connected No bl...

Page 12: ...Introduction 4 Axcess Programming Language ...

Page 13: ...and the statement to turn on a particular channel is ON RELAY_CARD RELAY Statements can also involve mathematical or logical operations when operators are used An operator is a character that performs a specific mathematical or relational function For example the operator used to set a variable equal to a value is For example the statement used to set variable X to the number 5 is X 5 The followin...

Page 14: ...emark not considered part of the actual program Comments are strictly for the benefit of the programmer to be used as navigational and organizational aids Any text placed between an open parenthesis and asterisk and the inverse an asterisk and closed parenthesis will not be compiled even if the text is separated over several lines For example This is a comment Comments are especially helpful in lo...

Page 15: ...ER RGB4 The identifier must have fewer than 26 characters Identifiers are not case sensitive Each identifier must be unique Once you define VHS3 do not choose the same name for a different identifier Keywords Keywords are certain words reserved for Axcess functions These are integral to the system and cannot be redefined or used as identifiers For example PUSH is a keyword and cannot be used as an...

Page 16: ...ITs then checks the WAIT_UNTIL list for any WAIT_UNTIL statement whose conditions have become true If one of these events has occurred the Central Controller immediately goes back into the program and executes the statement or compound statement directly following the WAIT or WAIT_UNTIL statement 2 Next the Central Controller checks to see if any channels activated by the PULSE keyword need to be ...

Page 17: ...ogram label each device in the system Each device on AXlink must have a unique device number For example card 1 may have device number 1 and card 2 may have device number 2 Whenever you use this device name in your program Axcess will automatically use the corresponding device number to reference the device This is the function of the DEFINE_DEVICE section It is placed at the beginning of the prog...

Page 18: ...d or referenced until they are defined so check that all devices are under this heading AMX encourages the practice of starting control panel device numbers at device 128 This includes radio frequency RF receivers touch panels softwire panels and all other control panels and receivers DEFINE_CONSTANT Constants are identifiers whose values remain unchanged throughout the entire program The process ...

Page 19: ...f a variable as a random container nearly anything can be placed in it For example a variable can represent any number from 0 to 65 535 variables cannot hold a negative number If one variable is subtracted from another the result will always be positive If you subtract a larger number from a smaller number the result wraps around at 65 535 For example 10 20 65 525 DEFINE_VARIABLE TEMP Single varia...

Page 20: ...following power up or system reset They cannot be executed again until another Axcess power up The keyword TO cannot be used in the DEFINE_START section instead use ON OFF or PULSE For information on these keywords refer to Changing the State of a Channel section on page 16 When the Axcess Control System is turned on the program that was last loaded into the Central Controller is in operation and ...

Page 21: ...ROGRAM_NAME Axcess uses a long file name to provide a more descriptive name for Axcess programs Thre file name gets embedded into the program the first time it is saved and will appear in the first line of the program For example PROGRAM_NAME long file name goes here This name is managed by Axcess and is automatically updated every time the file is saved ...

Page 22: ...Axcess Basics 14 Axcess Programming Language ...

Page 23: ...on with input changes FIG 2 Input and output functions of a channel Input Change Keywords PUSH The PUSH keyword is used to find out if a channel has had an input change from off to on such as when a button is pressed If the channel has been turned on the corresponding PUSH statement is activated The operation s following this PUSH statement is executed once after the channel is turned on PUSH stat...

Page 24: ... no channel has been turned on PUSH_DEVICE will contain Ø PUSH_DEVICE and RELEASE_DEVICE cannot both have a non zero value during the same pass through mainline At least one of them will always be zero RELEASE_DEVICE RELEASE_DEVICE stores the number of the device containing the channel whose button was most recently released If a button for device T_PANEL was released RELEASE_DEVICE would be equal...

Page 25: ...H statement The TO keyword has several conditions It must be used only below a PUSH statement It cannot be used with the WAIT keyword For detailed information refer to Multiple Waits in the Waits and Timer Keywords section It cannot be placed in the DEFINE_START section The channel or variable will act under the rules set by DEFINE_LATCHING DEFINE_MUTUALLY_EXCLUSIVE and DEFINE_TOGGLING For more in...

Page 26: ...ng Now you have the tools to write the code that will accomplish this On your touch panel you will set buttons 1 5 to activate the screen and drape functions Here is the first section of program code DEFINE_PROGRAM PUSH TP 1 SCREEN UP TO RELAY SCREEN_UP PUSH TP 2 SCREEN DOWN TO RELAY SCREEN_DN PUSH TP 3 DRAPES OPEN TO RELAY DRAPES_OPEN PUSH TP 4 DRAPES CLOSE TO RELAY DRAPES_CLOSE PUSH TP 5 DRAPES ...

Page 27: ...s Control System s communication bus Most devices such as a Touch Panel or a relay card have channels which either generate an input accept an output or both These inputs and outputs are referred to in the Axcess program as a device channel which is written like this TO DEVICE Channel This the device channel is the most fundamental concept of the Axcess Control System as it is the most common way ...

Page 28: ... The three kinds of mutually exclusive channels are momentary latching and toggling They are each described below Defining momentary mutually exclusive When a channel is turned on in a momentary mutually exclusive set it activates its physical output as long as the button is pressed When the button is released the physical output stops The status however does not work in the same manner Even after...

Page 29: ...hat the physical part and the status of a mutually exclusive latching channel operate in the same manner In your program the lighting relays are already defined as latching However you also want them to have the characteristics of a mutually exclusive set so that only one lighting mode can be on at one time Thus you would also place the device channels of these relays in the DEFINE_MUTUALLY_EXCLUS...

Page 30: ...d unlatches the SYSTEM_POWER channel channel 1 on card RELAY A press of the Screen Up button latches on the SCREEN_UP channel on device RELAY after unlatching SCREEN_DN The Screen Down button acts the same way as the Screen Up button but with the opposite channels Pressing Drapes Open or Drapes Close does several things If it is off it makes sure the other drape channel is off due to its mutually ...

Page 31: ...device channel reference it tells Axcess to take the output status of channel SCREEN_UP on device RELAY and send it as an output change to channel 1 of device TP Since the device channel RELAY SCREEN_UP is defined as being in a mutually exclusive group its status will be ON if it was the last channel activated in that set and the feedback assignment will light button 1 on the Touch Panel Grouping ...

Page 32: ...y used for determining whether or not a device is present in the system For example IF DEVICE_ID VCR If the card exists these statements are executed SEND_STRING Ø VCR is online 13 1Ø For a current list of device numbers for Axcess devices refer to the Devi ceid TXT text file included on the AMX Control Disc Deviceid TXT is located in the AMXTools AMXDOS Software folder DO_PUSH This keyword causes...

Page 33: ...without the device channel being deactivated by external means Here is the format DO_RELEASE device channel If a RELEASE statement corresponding to the device channel is present in the program it will be executed The DO_RELEASE keyword also forces the release of a device channel turned on by DO_PUSH GET_PULSE_TIME This system variable contains the current duration of PULSEs and MIN_TO as set by SE...

Page 34: ...tching and the variable VAR1 is defined as latching Define_Mutually_Exclusive Members of a mutually exclusive set are placed in parentheses underneath the DEFINE_MUTUALLY_EXCLUSIVE keyword The double period shortcut specifies a range of device channels to be defined as mutually exclusive For example DEFINE_MUTUALLY_EXCLUSIVE RELAY SCREEN_UP RELAY SCREEN_DOWN RELAY DRAPE_OPEN RELAY DRAPE_STOP The f...

Page 35: ...one by using the variable CUR_CAMERA as the device number in the TO statements instead of using CAMERA 1 CAMERA 2 and CAMERA 3 Here s the section of code PUSH TP 6Ø TILT UP TO CUR_CAMERA TILT_UP PUSH TP 61 TILT DOWN TO CUR_CAMERA TILT_DN PUSH TP 62 PAN RIGHT TO CUR_CAMERA PAN_RIGHT PUSH TP 63 PAN LEFT TO CUR_CAMERA PAN_LEFT In the example above no IF statement is required and this is the only came...

Page 36: ...and one AMX Touch Panel The device numbers are 6 97 98 99 and 128 respectively The IR serial cards will transmit infrared code to a video projector The Touch Panel will have three buttons Here are the functions to be associated with each button Button 57 Projector to input 5 recall Preset 1 on Camera 1 Button 58 Projector to input 6 recall Preset 1 on Camera 2 Button 59 Projector to input 7 recall...

Page 37: ...er card corresponding to the input desired on the projector Since the functions on IR cards for video projectors have the switcher inputs located at 11 20 you can add 10 to the desired input number to obtain the needed IR function number For instance if WHICH_CAM contains 98 you selected Camera number 2 and input number 6 on the projector the first PULSE statement will activate function 16 which i...

Page 38: ...Channel Characteristics 30 Axcess Programming Language ...

Page 39: ...or the volume control card You could create several individual variables and use IF statements or SELECT ACTIVE statements to select the preset you want to use Or even better you could create an array and use the index value explained below to pick the preset you want to use Here is your array declaration DEFINE_VARIABLE CAM_PRESETS 6 This declares a new variable PRESETS which is shown in FIG 6 Th...

Page 40: ...L_PRESETS 1Ø 1Ø VOLUME PRESETS VOL_PSET INDEX FOR ABOVE ARRAY DEFINE_PROGRAM PUSH TP 32 STORE STORE_VOL_PRESET NOT STORE_VOL_PRESET TP 32 STORE_VOL_PRESET PUSH TP 25 PRESET 1 PUSH TP 26 PRESET 2 PUSH TP 27 PRESET 3 PUSH TP 28 PRESET 4 PUSH TP 29 PRESET 5 PUSH TP 3Ø PRESET 6 PUSH TP 31 PRESET 7 VOL_PSET PUSH_CHANNEL 24 IF STORE_VOL_PRESET VOL_PRESETS VOL_PSET VOL_LEVEL ELSE SEND_COMMAND VOLUME PØL ...

Page 41: ...e time Once loaded into the Central Controller these strings cannot be changed except when a new program is loaded into the Central Controller Here is an example of a string literal assigned to an array PRESETS FOUR When Axcess processes this assignment it places the F ASCII value 70 in location 1 of PRESETS Ø ASCII value 79 in location 2 and so on as shown in FIG 9 String FOUR is placed in the ar...

Page 42: ... to S1 and then sent it to the card the entire contents of the string expression was sent Suppose that during power up of the Axcess Control System you want to set all the presets to default values You could do this by assigning values to each individual location in the CAM_PRESETS array It is recommended however to use a string expression to set all six at once as shown below DEFINE_START CAM_PRE...

Page 43: ...shown below the length will not change if the length was previously 3 it will still be 3 PRESETS 1 W PRESETS 2 O PRESETS 3 R PRESETS 4 D The SET_LENGTH string keyword explicitly sets the string length value of an array variable For instance to set the length value of CAM_PRESETS to 4 you would use the statement SET_LENGTH_STRING CAM_PRESETS 4 String lengths play an important role in the handling o...

Page 44: ...ing or array you are referencing and the number of characters you need Example STR LEFT_STRING PRESETS 3 After execution of this line the array STR will contain the first 3 characters of the array PRESETS If PRESETS contains the string HELLO then STR will contain HEL Also the length value of STR will be set to 3 RIGHT_STRING This keyword requires the same parameters as LEFT_STRING However RIGHT_ST...

Page 45: ...p to fill in the space Example DEFINE_VARIABLE SOURCE 2Ø DEST 2Ø DEFINE_PROGRAM SOURCE THIS IS A TEST DEST REMOVE_STRING SOURCE IS 1 After the last line is executed DEST will contain THIS and SOURCE will con tain IS A TEST Notice that after the removal the first location of the array SOURCE contains a space This is because REMOVE_STRING removed all characters from the beginning of SOURCE up to and...

Page 46: ... compiler Setting uppercase and lowercase In Axcess the lowercase letter a is not the same as the uppercase letter A Each has its own decimal ASCII code the code for a is 97 A is 65 This could become problematic when for example your program compares the incoming string ABC against another as shown below IF ABC YES statement s If the incoming string is YES there is no problem The statements are ex...

Page 47: ...er of characters from TEMP defined by its length value and then two numbers expressed here in hexadecimal The hexadecimal numbers in the example represent the codes for carriage return and line feed respectively Array Keywords Array keywords that you can use in the Axcess program are described in the table below Array Keywords FIND_STRING Tells Axcess to search through a string for a specified seq...

Page 48: ...ay starting at the end The length value of the array must be greater than Ø the returned value is an array Syntax result RIGHT_STRING string array number of characters SET_LENGTH_STRING Sets the length value of an array to a specified value The length value of an array is used by several of the Axcess string operation keywords Syntax SET_LENGTH_STRING string array number String Keywords REDIRECT_S...

Page 49: ...te For conceptual purposes imagine that a volume control card has two volume knobs one for the left speaker and one for the right as shown in FIG 11 Each knob has a value range from Ø to 255 These knobs represent the two levels present in the volume control card When a level is discussed in the text it is usually referring to the value of one of these imaginary knobs Creating Levels Most devices h...

Page 50: ...d DEFINE_DEVICE VOLUME 96 AXB VOL3 TP 128 AXU CVA COLOR VIDEO PANEL DEFINE_CONSTANT VOL_UP 1 THESE CHANNELS AFFECT VOLUME LEVELS 1 2 VOL_DN 2 VOL_MUTE 3 DEFINE_VARIABLE VOL_LEVEL LEVEL OF VOLUME CHANNEL 1 VOL_PRESET VOLUME PRESET DEFINE_START CREATE_LEVEL VOLUME 1 VOL_LEVEL This code defines the devices you will use a variable in which to store the volume level value and the statement in the start...

Page 51: ...E_LEVEL device level number variable CREATE_LEVEL requires three parameters The device from which to read the level The level of the device to read some devices have many different levels The variable in which to store the level This keyword creates an association between the specified level of the device and the specified variable During the execution of a program Axcess continu ally updates the ...

Page 52: ...ESET VOL_LEVEL RELEASE TP 2Ø VOLUME PRESET CANCEL_WAIT STORE VOL PRESET SEND_COMMAND VOLUME PØL ITOA VOL_PRESET TP 2Ø VOL_LEVEL VOL_PRESET The PUSH of the Preset button turns off the mute and starts a two second wait When the wait expires the current volume level VOL_LEVEL is stored in the variable VOL_PRESET On the release of the button the WAIT to store the VOL_PRESET is canceled and the current...

Page 53: ... connections are listed Here is how DEFINE_CONNECT_LEVEL is used DEFINE_CONNECT_LEVEL device 1 level number 1 device 2 level number 2 etc The section inside the parentheses represents a single connection All levels listed in the connection will follow each other If any one level changes all others in the connection will change to match Any number of levels may be supported per connection and there...

Page 54: ...Levels 46 Axcess Programming Language ...

Page 55: ...here is an order of precedence for arithmetic operators that is some operations are performed first and others second For example multiplication operations are performed before addition operations Here is an example that illustrates this precedence X 7 5 3 Reading this expression left to right X 36 However since multiplication takes precedence X 22 5 3 15 and 7 15 22 For detailed information on pr...

Page 56: ...o true value Otherwise Axcess does not execute the statement directly under the IF statement It is possible then to assign a relational expression to a variable For example DEFINE_PROGRAM X 9 Z X 5 IF Z X IS GREATER THAN 5 SEND_STRING Ø X IS GREATER THAN 5 ØD ØA In this case Z will be equal to 1 since the expression X 5 is true As a result the following IF statement is also true and Axcess execute...

Page 57: ...pression table comparing two conditions Since both X 5 and Y 4 are not true the result of the expression is false and Statement 2 is executed If both conditions had been true Statement 1 would be executed instead NOT is used differently than the other logical operators since it only requires one condition For example AND Both conditions must be true for the result to be true OR At least one of the...

Page 58: ... is true since OR requires only one condition to be true As a result Statement 1 is executed Refer to the Precedence Among Operators section on page 51 for more information Bitwise Operators Bitwise operators perform the same logical operations mentioned earlier but on a bit by bit basis These operators are BAND BOR BXOR and BNOT They are similar to logical operators For example the keyword BAND p...

Page 59: ...to manually establish precedence for a certain operation use parentheses to enclose the operation Multiple levels of precedence can be created with additional parentheses For example X 4 6 2 3 1 The first operations solved are 4 6 and 2 3 since these operations are enclosed by the innermost parentheses Next 10 is divided by 5 in the second level of parentheses Finally 1 is added making X equal to ...

Page 60: ...tatements are executed if the above And statement is true that is if X 1 is true and Y 2 is true NOT Use when the opposite of a condition makes the expression true Example IF NOT X 2 If X 2 these statements are executed OR Typically used in IF statements to check for a true condition The logical opera tor OR is used to evaluate two conditions At least one of the conditions must be true for the ent...

Page 61: ... byte is inverted that is each 1 bit becomes Ø and vice versa The result of the operation can be tested with an IF statement or assigned to a variable Example X BNOT 1ØØ X is equal to 155 BOR Performs a bitwise Or operation between two bytes Each of these bytes can be a constant value number or variable The result of the operation can be tested with an IF statement or assigned to a variable Exampl...

Page 62: ...Operators 54 Axcess Programming Language ...

Page 63: ...All arrays discussed to this point have a range of values in each location of Ø to 255 The range of values in a single variable is Ø to 65 535 and when a value greater than 255 is assigned to an array location the number is truncated above 255 For example if the number 500 is assigned to a location in an array the actual number that is assigned is 244 The easiest way to find the actual number is t...

Page 64: ... returns a single integer as the result Example DEFINE_CONSTANT STR1 456 STR2 YES789GO19 DEFINE_PROGRAM NUM ATOI 123 NUM 123 NUM ATOI STR1 NUM 456 NUM ATOI STR2 NUM 789 If the string contains all non numeric characters such as HELLO ATOI returns the integer Ø However if there are any numeric characters embedded in the string ATOI returns the first complete set it comes upon as is the case with STR...

Page 65: ...d into a hexadecimal ASCII string If you substitute the ITOA keywords in the previous example with ITOHEX key words this would be the result STR ITOHEX 123 STR 7B STR ITOHEX CONST STR 1C8 STR ITOHEX VAR STR 315 Notice there are no dollar signs in the results This is because the dollar sign indicates a numerical value expressed in hexadecimal and is only used when telling Axcess that a number is he...

Page 66: ...Variable Types and Conversions 58 Axcess Programming Language ...

Page 67: ...which can be referenced with an index value To declare a two dimensional array DEFINE_VARIABLE NAMES 1Ø 3Ø While a one dimensional array has a single storage capacity value a two dimensional array has two NAMES is a two dimensional array that can hold ten one dimensional arrays with a storage capacity of 30 characters each The total storage capacity of NAMES is 10 characters by 30 characters for a...

Page 68: ...n the above example that row has its length value set in the same manner as a one dimensional array does The LENGTH_STRING and SET_LENGTH_STRING functions operate on rows in two dimensional arrays in the same way as whole one dimensional arrays Once the above example is executed the LENGTH_STRING function returns the first three rows of NAMES X LENGTH_STRING NAMES 1 X will contain Ø X LENGTH_STRIN...

Page 69: ...OY AIKMAN and its length value will be 11 If you were to try to retrieve the entire first row nothing would be returned because its length value is Ø The third method of accessing a two dimensional array is to assign it to another two dimensional array PEOPLE NAMES This will copy the entire contents of NAMES into PEOPLE regardless of length values individual rows This method copies the entire cont...

Page 70: ...Two Dimensional Arrays 62 Axcess Programming Language ...

Page 71: ...t of camera control buttons Your panel could now look like the one in FIG 19 This configuration has seven fewer buttons than before In this configuration the user selects the camera with the Select button then controls it with the camera control buttons This will not be a button for button program because the camera control buttons have three possible functions each In the program you will use Boo...

Page 72: ...n statement is true then Statement 1 is executed and Statement 2 underneath the ELSE statement is ignored If the Boolean statement is false then Statement 2 is executed Statement 1 is automatically ignored if the expression is false The IF ELSE IF Set of Statements While IF and IF ELSE allow two different paths IF ELSE IF allows an essentially unlimited number of paths Axcess stops at the first tr...

Page 73: ...T ACTIVE Boolean expression 1 Statement 1 ACTIVE Boolean expression 2 Statement 2 ACTIVE Boolean expression 3 Statement 3 etc Each one of the Boolean expressions is evaluated in order until one is found to be true The statements associated with the true expression are then executed and the path flows to the statements following the closing brace Using SELECT ACTIVE is preferable to using multiple ...

Page 74: ...nalyzed to achieve one result These results can be visualized using Boolean expression tables as shown in FIG 20 The following text formula can also be followed to find that result If STATEMENT 1 is its condition true or false Boolean operator STATEMENT 2 is its condition then the result of the expression is result of statement conditions The result is found by basing the conditions of the stateme...

Page 75: ...to be true The statements associated with that true expression are then executed and the path then flows to whatever statements follow the closing brace Using a SELECT ACTIVE is much preferred to multiple IF ELSE IF statements as it uses less memory and runs faster ELSE If the corresponding IF statement is false the program will jump to this section of the IF ELSE set of statements See IF for deta...

Page 76: ...en State ment 2 is executed Statement 1 is automatically ignored if the expression is false IF IF ELSE The IF ELSE IF set of statements allow an essentially unlimited number of paths Axcess stops at the first true expression and executes the following statement Upon completion it goes on to the rest of the program For exam ple IF expression Statement 1 ELSE IF expression Statement 2 ELSE IF expres...

Page 77: ...does when running mainline It is during this scanning that Axcess receives information about input changes from devices such as Softwire Panels and Touch Panels This activity also takes place after each loop through a LONG_WHILE Therefore if a user presses a button while Axcess is looping through a LONG_WHILE the input change is lost to any programming outside the LONG_WHILE loop If this becomes a...

Page 78: ... RELAY 1 is turned on and RELAY_INDEX is incremented by one Then the program loops back to the WHILE statement This loop con tinues until RELAY_INDEX becomes 15 in this case the compound statement following the WHILE is not executed and Axcess continues to the rest of the program This block of code effectively turns on the first 14 channels of device RELAY MEDIUM_WHILE Operates like a LONG_WHILE b...

Page 79: ...ONG_WHILE loop initialize the timeout flag to Ø and set the RELAY_INDEX the relays that will turn on first to 1 Then start a three second wait to set WHILE_TIMEOUT to 1 The WAIT keyword tells the Central Controller the fol lowing code needs to be executed at some later time The time is specified right after the WAIT keyword in tenths of a second In this example WAIT 3Ø is three seconds The Central...

Page 80: ...While Keywords 72 Axcess Programming Language ...

Page 81: ...e any data received from the specified device into the specified array When Axcess places the bytes into the array it increments the length value for the array and then places the bytes into the array at the current end of the array See FIG 23 for a pictorial explanation Even though the array is acting as a buffer it is still an array and can be treated as one You can still access the individual l...

Page 82: ... third is now the second and so on Here is the syntax string GET_BUFFER_CHAR array The parameter passed to GET_BUFFER_CHAR must be an array but does not need to be a buffer Remember that all buffers are arrays but not all arrays are buffers The statement will operate identically in either case The result must be a simple variable not an array because only one character will be returned These examp...

Page 83: ...ces to enter completely Be sure to place a GET_BUFFER_CHAR statement in a position to do this Remember Axcess is constantly running through the main program and will execute the GET_BUFFER_CHAR statement as long as it is in its path of execution To get the data of the SWT_BUFFER using REMOVE_STRING use the following code IF LENGTH_STRING SWT_BUFFER AND FIND_STRING SWT_BUFFER T 1 OR FIND_STRING SWT...

Page 84: ...xcess places the byte into the array Axcess increments the length value for the array and then places the byte at the end of the array When the array is full all bytes in the array are shifted to make room for the new byte at the end Though the array is acting as a buffer it is still an array and can be treated as one You can access its individual locations send it to a device assign it to other a...

Page 85: ...FFER_CHAR array The parameter passed to GET_BUFFER_CHAR must be an array but does not need to be a buffer The keyword will operate identically in either case Only one byte character will be returned and this value can be assigned to a variable array or a cell in an array GET_MULTI_BUFFER_STRING To access characters coming into a multi buffer you must first use GET_MULTI_BUFFER_STRING to transfer t...

Page 86: ...Using Buffers 78 Axcess Programming Language ...

Page 87: ...immediately following the expired WAIT keyword Up to 50 WAITS are allowed in the list at a time Time is measured in tenths of a second A WAIT of 10 is one second a WAIT of 15 is one and a half seconds a WAIT of 20 is two seconds and so on An example application of a time delay would be if your system has two relays controlling system power One could be for the audio amplifier and the other for the...

Page 88: ...ich is executed if the rack power is on uses a WAIT to perform a time delayed power down of the system The first statement cancels the WAIT named AMPS ON to stop any previous attempts to turn the amps on The second statement inside the compound statement turns off the amplifier relay The next statement is a WAIT statement for 1 second followed by an OFF statement to the rack power relay Axcess pla...

Page 89: ...ower is turned off lights go to the Full setting the screen is raised and the drapes are opened After a 1 second delay the rack power turns off 2 minutes later the lights go to the Off setting Here is the code for the System Power Push for the scenario described above DEFINE_PROGRAM PUSH TP 8 POWER ON OFF IF RELAY SYSTEM_POWER CANCEL_WAIT AMPS ON CANCEL_WAIT LIGHTS TO MED OFF RELAY AMP_POWER PULSE...

Page 90: ... a WAIT removing it from the wait list CANCEL_ALL_WAIT nullifies every WAIT currently in the list The keywords PAUSE_ALL_WAIT and RESTART_ALL_WAIT act the same as PAUSE_WAIT and RESTART_WAIT except they affect all WAITs in the wait list named and unnamed You could use a named WAIT in your System Power Push routine as shown in the example above For example if the user just turned off the power Axce...

Page 91: ...he first execution of this statement the value in variable FLASH is inverted If FLASH was Ø it will be changed to 1 and if it was non zero it will be changed to Ø On the next pass through mainline the WAIT will again be placed into the wait list and the cycle will repeat for the duration of the program This in effect creates a variable whose state inverts every half second The Wait_Until Keyword T...

Page 92: ...eled with the CANCEL_WAIT_UNTIL keyword which removes it from the WAIT_UNTIL list The CANCEL_ALL_WAIT_UNTIL keyword removes all WAIT_UNTILs from the WAIT_UNTIL list Timer Keywords Several more timing features are contained in the timer keywords The SET_TIMER and GET_TIMER keywords allow you to have a stopwatch and the ability to measure time intervals within the Axcess Control System The Timer key...

Page 93: ...is example a greater than sign was combined with the equal sign The timer could reach the number 100 while the program is being executed else where When Axcess reaches the GET_TIMER section the timer might be 103 If the condition was that GET_TIMER be equal to 100 the following state ments will be skipped Never use only an equal sign with the GET_TIMER sys tem variable in an IF statement Unlike va...

Page 94: ...Waits and Timer Keywords 86 Axcess Programming Language ...

Page 95: ...al emulator refer to Terminal emulator in the Communications Menu section Individual storage locations cannot be referenced Typically these variables are used with an IF statement Once the condition is true certain statements are executed For instance suppose you wanted to turn off all of the lights at 11 00 PM every night The code would look like this DEFINE_VARIABLE PULSING_LIGHTS 1 IF PULSING L...

Page 96: ...e IF DATE 12 25 These statements are executed every Christmas DAY The system variable DAY returns the current day of the week in the form of one of the strings MON TUE WED THU FRI SAT or SUN Example IF DAY MON These statements are executed every Monday TIME The system variable TIME returns the current time in the form of the string HH MM SS in which HH equals hours MM equals minutes and SS equals ...

Page 97: ...d TEST are not the same Subroutines must be defined before they can be used For this reason DEFINE_CALLS are usually found right before the DEFINE_START section of the program For example DEFINE_VARIABLE LIGHT_PRESET CURRENT LIGHTING PRESET DEFINE_CALL PRESET LIGHTS CARD PRESET PULSE CARD PRESET LIGHT_PRESET PRESET DEFINE_START CALL PRESET LIGHTS LIGHTS LIGHT_FULL DEFINE_PROGRAM PUSH TP 7 LIGHTS O...

Page 98: ...FINE_CALL and before the first open brace with the keyword LOCAL_VAR preceding the block of local variables defined Nowhere else in the program can any code access the two variables LOC_VAR and LOC_ARRAY since they are local to the subroutine TEST CALL A local variable can have the same name as a local variable in another subroutine If another subroutine declares a local variable LOC_VAR that subr...

Page 99: ...he string to the card named SWT The same subroutine can be used with different parameters to produce different strings Here are some examples DEFINE_PROGRAM PUSH TP 5Ø SWITCHER 2 CALL DO SWITCH SWT 1 2 PUSH TP 51 SWITCHER 3 CALL DO SWITCH SWT 2 12 PUSH TP 52 SWITCHER 4 CALL DO SWITCH SWT 1Ø 2Ø Passing values back to the caller A parameter variable can be modified inside a subroutine like any other...

Page 100: ...e a constant value as a parameter to this subroutine and still get a new value returned rewrite the DEFINE_CALL to have two parameters as shown below DEFINE_CALL SQUARE NUMBER RESULT RESULT NUMBER NUMBER Here are some examples of using this subroutine CALL SQUARE 5 X on return X will contain 25 CALL SQUARE X Y on return X will contain 25 Y will contain 625 It is important to note that the reassign...

Page 101: ...re is the format DEFINE_CALL subroutine name The subroutine goes here Spaces in the subroutine name are allowed because it is a string literal Notice that the subroutine s code is enclosed in braces No matter how long the sub routine is it must be in this format LOCAL_VAR This keyword is used inside a DEFINE_CALL to declare local variables A local variable is a variable which is declared inside a ...

Page 102: ...Using Subroutines 94 Axcess Programming Language ...

Page 103: ...ur program and putting them into one or more include files An include file is a DOS file which is included in the compiling process without having to reside in the computer s memory To include a file in a program use the keyword INCLUDE followed by the filename in single quotes For example DEFINE_PROGRAM Program statements can go here INCLUDE TEST AXI More program statements can go here When the c...

Page 104: ...les which have the DOS extension LIB The difference between library files and include files is that library files must contain a DEFINE_CALL subroutine with the same name as the PROGRAM_NAME on the first line of the library file This DEFINE_CALL can then be called from within a program using the SYSTEM_CALL keyword Here is an example of a small library file listing PROGRAM_NAME SQUARE DEFINE_CALL ...

Page 105: ... AMX BBS For information on accessing the AMX BBS refer to Worldgroup Readme on the Control Disc or refer to the Accessing the AMX BBS section of this manual The purpose of the factory SYSTEM_CALLs is to maintain a consistent look and feel for the control panels regardless of how the deck behaves from its own remote control For example when some VCRs are in the pause mode pressing Pause again will...

Page 106: ...ed paragraphs describe the effect of adding another SYSTEM_CALL to the program SYSTEM_CALL SEND SWT1 AMX Axcess SYSTEM_CALL SEND SWT2 GOOD TIMES In this case only one DEFINE_CALL SEND is compiled and both of these lines call the same subroutine The first call sets the routine s STR1 STR2 and CARD parameter variables sends the string AMX to device SWT1 and starts the named WAIT The next SYSTEM_CALL...

Page 107: ...e adding a 1 to the end of the DEFINE_CALL name and the WAIT name For example if a SYSTEM_CALL were made with the instance number equal to 1ØØ the DEFINE_CALL would be named SEND1ØØ and the WAIT would be named SS WAIT1ØØ All SYSTEM_CALLS using the same instance number call the same copy of the library file For example SYSTEM_CALL 1 SEND SWT1 HOW FEE calls copy 1 SYSTEM_CALL 2 SEND SWT2 DO FI calls...

Page 108: ...Include Files and System_Calls 100 Axcess Programming Language ...

Page 109: ...the library file and automatically includes the library file for compilation The library file is actually compiled after the main program file is compiled _ _Date_ _ At compile time this keyword is replaced by a string MM DD YY that contains the compile time date For example The program was compiled on May 24 1998 SEND_STRING Ø _ _DATE_ _ The string Ø5 24 98 is sent to device Ø DEFINE This keyword...

Page 110: ...yword is on Example This is line number 23 SEND_STRING Ø _ _LINE_ _ The value 25 two lines down from 23 is sent to device Ø _ _NAME_ _ At compile time this keyword is replaced by a string that contains the PROGRAM_NAME descrip tion on the first line of your program Example PROGRAM_NAME This is a sample Axcess program Later in the program SEND_STRING Ø _ _NAME_ _ The string This is a sample Axcess ...

Page 111: ...he program it is executing is accomplishing what the user intends Compilation Errors and Warnings When the compiler finds an error during the compilation process it informs the programmer Most of the time these errors occur due to a typographical error or incorrect syntax of a particular command Refer to the Compiler Error Messages section for explanations of common compiler errors Sometimes the c...

Page 112: ...he AX File menu w Define_Call is not used This warning occurs at the end of program compilation for each DEFINE_CALL subroutine that was declared but never used The gener ation of this warning can be turned on or off with the Options selection in the AX File menu w Integer applies to arrays only This warning appears when the keyword INTEGER is applied to a non array type of variable Doing this is ...

Page 113: ...the set of errors BAD TO VARIABLE and BAD TO CHANNEL Run Time Errors Bad assign 2dim These errors occur if an attempt is made to assign a two dimensional array to a different type such as a variable or one dimensional array and vice versa Bad assign Call These errors occur if the Central Controller cannot assign a parameter in a CALL statement to the parameter in the corresponding DEFINE_CALL stat...

Page 114: ... Ø X EQUALS Y ØD ØA ELSE SEND_STRING Ø X DOES NOT EQUAL Y ØD ØA In this example you can observe at run time which branch the program takes by viewing the message sent out of the Central Controller s communications port This technique is also helpful in locating run time errors By sending messages before and after suspected code you can determine if the code contains any bugs For example DEFINE_VAR...

Page 115: ...ome function keys and displays a speedometer that is updated on each pass through mainline Here is a summary of the available functions F1 Adds a variable to watch Only simple variables one dimensional arrays and the rows of a two dimensional arrays can be viewed The Ins key also activates this function F2 Deletes the currently selected variable from the window The Del key also activates this func...

Page 116: ... execution is suspended between each pass through mainline F8 In single step mode this key causes mainline to be executed once This key only functions in single step mode F9 Allows you to change the way the variable is displayed This key toggles from HEX to ASCII to decimal format to binary to octal depending on the type of variable that is selected This feature is only available on Version 3 05 o...

Page 117: ...Constant type not allowed A constant value was declared as latching tog gling or mutually exclusive as shown below DEFINE_CONSTANT PLAY 1 DEFINE_LATCHING PLAY Error PLAY is a constant Define_Call must have a name DEFINE_CALL must have a name after it For example DEFINE_CALL VHS Define_Call name already used The name of the DEFINE_CALL has already been used This name cannot be the same as an alread...

Page 118: ...owed within Wait These keywords are not allowed in a section of code which will be executed due to a WAIT key word String constant expected A string is required for the particular operation This error occurs if a string literal enclosed in single quotes does not follow the PROGRAM_NAME key word String constant never ends EOF encountered A string literal is started but never ends Add a clos ing sin...

Page 119: ... identifier An attempt was made to reference an identifier that has not been defined previously in the program Unmatched End_If An END_IF keyword was found but no IF_DEFINED or IF_NOT_DEFINED was previ ously compiled Unrecognized character in input file An invalid character was found during compilation Use System_Call instance name This error occurs if a SYSTEM_CALL statement is written incorrectl...

Page 120: ...Compiler Error Messages 112 Axcess Programming Language ...

Page 121: ...L can only be used once in the DEFINE_START section of your program Next you must send command packets to Axcess The table below lists the command packets Each of these packets consists of the following An attention character prepares Axcess for the transmission it is always 2A for sending commands and it is always 26 for responses A command number One or more parameters A checksum byte the sum of...

Page 122: ... the previous sections a command was sent to the Central Controller In turn the Central Controller also responds to some of the commands Figure 70 lists the responses For example after you sent the string AMX to the Central Controller you would receive the following packet if the transmission was successful 26 Ø4 Ø3 Ø3 41 4D 58 1A Command packets Cont Command Packet structure SET BYTE LEVEL 13 DEV...

Page 123: ...response on For example to turn off RECEIVE STRING responses and turn on GET PUSH and GET RELEASE responses send the mask byte 6Ø as shown in FIG 31 External_Control This keyword tells the Central Controller to use a particular Axcess RS 232 422 Interface Card as an external control port Once a port has been thus defined all system functions can be controlled by an external computer or by another ...

Page 124: ...The External_Control Protocol 116 Axcess Programming Language ...

Page 125: ...pleted 3 Use REV1 or RV1 after lines or sections that were changed in program revisions Standard ON RELAY 1 SYSTEM POWER REV1 also correct ON RELAY SYSTEM_POWER RV1 List the type and version of master Normal Enhanced AXCENT2 used in the system after PROGRAM_NAME and before DEFINE_DEVICE Standard PROGRAM_NAME AMX01 BOARDROOM SO 99999 REV2 XXX BETA DATE 04 08 95 TIME 01 23 45 SYSTEM TYPE ENHANCED MA...

Page 126: ...tem you program Not recommended SLD 100 RELAYB 101 FLOPPY 102 SWP 103 TP 104 Standard SLD 96 AXB SLD MOST BOX DEVICES START AT 96 RELAYB 97 AXB REL8 FLOPPY 127 AXB FD FLOPPY DRIVES AT 127 126 SWP 128 AXP SP ALL OTHER DEVICES START HERE TP 129 AXP EL 6 Use the following prefixes when naming AXLINK buss devices TP AXP EL AXP EL AXP LC AXP T S AXP TLC SWP AXP SP AXP SP MSP AXP MSP8 AXP MSP16 AXP MSP2...

Page 127: ...ent will be connected Not recommended RELAY 2 SONY 1 IR TV STANDARD TUNER 1 AXC IR S SONY ST92TV HC RMU72 SO21 IRL SCREEN 2 AXC REL8 DRAPER SCREEN 8 If the device is an AXR_RF or other such receiver place the transmitter type radio code and frequency if not 304MHZ in the comment Not recommended RADIO1 128 ROOM 1 RADIO2 129 ROOM 2 STANDARD RADIO1 128 AXR RF ROOM 1 TXC16 RC8 TXC16 RC9 RADIO2 129 AXR...

Page 128: ...those in the DEFINE_DEVICE section should start at column 36 and section comments should take an entire line padded with asterisks Not recommended POWER OFF DEVICES OFF RELAY 1 system power off Off relay 2 Amp power off Standard POWER OFF DEVICES OFF SYS_PWR 1 SYSTEM POWER OFF OFF PWR_AMP 2 AMP POWER OFF 12 CALL names and WAIT names are case sensitive and can be in upper and lower case Example The...

Page 129: ...ne Not recommended IF TEMPERATURE COOLING_SET_POINT ON RELAY 5 TURN ON FAN ON RELAY 6 TURN ON COMPRESSOR Standard IF TEMPERATURE COOLING_SET_POINT ON FAN FAN_ON TURN ON FAN ON COMPRES COMPRES_ON TURN ON COMPRESSOR 15 Braces should be aligned with the commands for which they are used Not recommended IF TEMPERATURE COOLING_SET_POINT ON RELAY 5 TURN ON FAN ON RELAY 6 TURN ON COMPRESSOR Standard IF TE...

Page 130: ...utton on the panel uses the command Not recommended PUSH TP 25 TO RELAY 3 Standard PUSH TP 25 LIGHTS OFF TO LIGHTS LIGHTS_OFF 18 Many programmers choose to assign more descriptive names in DEFINE_CONSTANT rather than to simply use channel numbers Standard DEFINE_CONSTANT PLAY 1 STOP 2 PAUSE 3 FFWD 4 REW 5 REC 8 19 Make sure the names given to variables and are indicative of their usage 20 Using de...

Page 131: ...ELAY 3 LIGHTS OFF TP 25 RELAY 3 22 There should be no space between a PUSH and a RELEASE statement and its opening bracket Conversely there should always be a space for TO MIN_TO ON OFF and PULSE statements there should be no spaces within the brackets for any case Not recommended PUSH TP 25 TO RELAY 3 LIGHTS OFF TP 25 RELAY 3 Standard PUSH TP 25 TO LIGHTS LIGHTS_OFF LIGHTS OFF TP 25 RELAY 3 23 Fe...

Page 132: ...TP 26 TO RELAY 4 LIGHTS ON TP 26 RELAY 4 24 Do not use constants or variables for PUSH statements in mainline except for AXC INP8 cards and similar devices Not recommended PUSH TP VCR_SELECT CURRENT VCR Standard PUSH TP 86 VCR SELECT CURRENT VCR 25 Use descriptive names for all DEFINE_CALLs and their parameters Not recommended DEFINE_CALL MACRO 1 P1 P2 ON P1 P2 WAIT 50 WAITING OFF P1 P2 Standard D...

Page 133: ...UMBER LOCAL_VAR LOOP PRE LOOP COUNTER PRE 1ØØ LOOP Ø WHILE LOOP PRE LOOP LOOP 1 INCREMENTAL COUNTER 27 List any PUSH_CHANNEL ranges used in the program above the DEFINE_DEVICE section Include the section comment so it can be found later using the SEARCH command ALT S Standard PROGRAM_NAME AMXØ1 BOARDROOM SO 99999 REV2 XXX BETA DATE Ø4 Ø8 95 TIME Ø1 23 45 SYSTEM TYPE ENHANCED MASTER V3 5ØØ PUSH_CHA...

Page 134: ... _ _LINE_ _ DO_PUSH RANDOM_NUMBER _ _NAME_ _ DO_RELEASE REDIRECT_STRING _ _TIME_ _ ELSE RELEASE _ _VERSION_ _ EXTERNAL_CONTROL RELEASE_CHANNEL ACTIVE FIND_STRING RELEASE_DEVICE AND GET_BUFFER_CHAR REMOVE_STRING ATOI GET_MULTI_BUFFER_STRING RESTART_ALL_WAIT BAND GET_PULSE_TIME RESTART_WAIT BNOT GET_TIMER RIGHT_STRING BOR IF SELECT BXOR INCLUDE SEND_COMMAND CALL INTEGER SEND_LEVEL CANCEL_ALL_WAIT IT...

Page 135: ...Appendix 127 Axcess Programming Language ASCII Code Chart FIG 32 lists the hexadecimal values for all ASCII characters FIG 32 ASCII Code Chart ...

Page 136: ...el HT Horizontal tab CR Carriage return LF Line feed DC1 Device control 1 NAK Negative acknowledge DC2 Device control 2 NUL Null DC3 Device control 3 RS Record separator DC4 Device control 4 SI Shift in DEL Delete SO Shift out DLE Data link escape SOH Start of heading EM End of medium SP Space ENQ Enquiry STX Start of text EOT End of transmission SUB Substitute ESC Escape SYN Synchronous idle ETB ...

Page 137: ...ber field If you need to use some access number like 9 make sure you enter it before the phone number Also make sure you include the long distance access code if you are not in Dallas TX d Click on Settings This is where you set up your modem e Click on the com port your modem is attached to If you aren t sure which port your modem is attached to contact your MIS manager or the place you bought yo...

Page 138: ... Click Telnet in the How to Connect section c Enter BBS AMX COM in the Host field d Enter your user information in the How to Log On section 8 If you have an account on the AMX BBS a Uncheck Log on as new user b Enter your AMX BBS user name in the User ID field c Enter your AMX BBS password in the Password field 9 If this is the first time you ve logged on the AMX BBS a Leave Log on as new user ch...

Page 139: ... Axcess Keywords 117 Axcess Programming Cable 2 Axcess Programming Standards 117 AXlink 1 B Bad assign 2dim 105 Bad assign Call 105 Bad element assign 105 Bad Off Bad On Bad To 105 Bad re assign Call 105 Bad run token 105 Bad Set_Length 105 Bad While 105 baud rate 2 Bitwise Operator Keywords 53 BAND 53 BNOT 53 BOR 53 BXOR 53 Blinking Light Status 3 Boolean Expression Table 66 Boolean Expressions 6...

Page 140: ...19 Direct Assignment 18 DO PUSH 113 DO RELEASE 113 DO_PUSH 24 DO_RELEASE 25 DUPLICATE SYMBOL 11 Duplicate symbol 109 E Evaluation stack overflow 109 Evaluation stack underflow 109 External_Control 115 External_Control Protocol 113 F Factory System_Calls 97 Feedback 23 feedback statement 23 G GET BYTE LEVEL 114 GET CHANNEL STATUS 113 GET DEVICE ID 114 GET LEVEL 114 GET PUSH 114 GET RELEASE 114 GET ...

Page 141: ... 51 Pre Processor Statements 101 Program_Name must be on line 1 110 Programming Feedback 23 PULSE 113 Push Release not allowed within Push Release 110 Push Release not allowed within Wait 110 Push_Channel not allowed within Wait 110 Push_Device not allowed within Wait 110 Putting Input and Output Together 18 R READ ADDRESS 113 RECEIVE STRING 114 Receiving strings 73 Recommended device numbers 1 re...

Page 142: ...wed within Wait 110 Too few parameters in Call 111 Too many include files 111 Too many parameters in Call 111 Tracing program flow 106 Tracking down your errors 106 TURN CHANNEL OFF 113 TURN CHANNEL ON 113 Two Dimensional Arrays 59 Type mismatch in function call 111 Types of Errors 103 U Undefined identifier 111 Unmatched End_If 111 Unrecognized character in input file 111 Uppercase vs Lowercase 3...

Page 143: ...Index 135 Axcess Programming Language ...

Page 144: ...ive richardson TX 75082 USA 469 624 8000 800 222 0193 fax 469 624 7153 technical support 800 932 6993 033 004 1818 2 02 2002 AMX Corporation All rights reserved AMX the AMX logo the building icon the home icon and the light bulb icon are all trademarks of AMX Corporation AMX reserves the right to alter specifications without notice at any time In Canada doing business as Panja Inc ...

Reviews: