Configuration File Structure
The configuration file uses a notation called JSON. This is an international standard notation. It doesn’t matter what JSON stands for, but notice that it is not JASON.
The configuration files have the extension .MOAS. They are text files. They can be edited using Notepad or any other text editor. If you use a word processor you must save the result as a text file. There are also online web based JSON editors available for free.
The character encoding for the files is UTF-8. This will not matter to you unless you want to put non-English characters in the names. The MOAS II server will handle just about any character, as will the Android client and the MOAS Windows client. The Windows OASP client does not handle non-English characters properly.
The syntax is described on www.json.org. JSON was designed by computer programmers and most of the information on the Internet is written for computer programmers. This description is written for non-programmers.
Names and values
Section titled “Names and values”In JSON everything has a name and a value (with one exception).
Names are written in quotes. Case matters – “Thing” , “THING” , and “thing” are
three names. In the configuration file all names start with a capital letter. If a name is
more than one word all of the words start with capitals and the spaces are left out. For
example a first name might be named “FirstName”. “ID”, which stands for identifier, is an
exception – it is all capitals.
Names are separated from values with a colon. “FirstName” : “Paul” is proper
JSON.
There are several types of values:
String
Section titled “String”A string is always in quotes. A string can contain any UTF-8 characters. “20 Beam” , “Stack”, and “42” are all strings.
Number
Section titled “Number”A number is one or more decimal (base 10) digits, optionally with a minus sign in front. A decimal point and more digits are also allowed but currently no numbers in the configuration file use decimal points. Numbers are never in quotes.
The maximum value for a number is 2,147,483,647 and the minimum value is -
2,147,483,648. Commas, the plus sign, and leading zeros are not allowed.
1, -30 , and 65536 are valid numbers. 01 , +30 , and 65,536 are not. “2” is
not a number, it is a string.
Boolean
Section titled “Boolean”A Boolean is a fancy name for a value that is true or false. The words true and
false, all lowercase are Boolean JSON values. Boolean values are never in quotes.
JSON allows the word null as a value. It is not used in the configuration file.
A value can be a group of names and values surrounded by curly braces.
For example, "Person" : { "FirstName" : "Paul", "LastName" : "Young" }
An empty group is allowed. "Nothing" : {}
A value can be a list of values surrounded by square brackets.
For example, "Relays" : [ 1, 2, 3, 20 ]
A list with one value is not the same as that value. In other words, [ 1 ] is not
the same as 1. If a list has only one value it must still be written as a list.
An empty list is a valid value. "Fast" : [] is acceptable.
Since a group is a value a list can contain groups. This allows for nesting:
"Antennas" : [ { "ID" : 1, "Name" : "80 Dipole", "Relays" : [1] }, { "ID" : 2, "Name" : "40 Dipole", "Relays" : [2] }]In the above example the value of Antennas is two groups, one describing an 80 meter dipole and one describing a 40 meter dipole. The configuration file looks like this but with more information and more nesting.
JSON allows values in lists to be of different type, such as [ 1, "Fred", false ]
but in the configuration file all of the values of a list are of the same type.
Commas
Section titled “Commas”The comma is used to separate name/value pairs in groups and values in lists. The comma must not be used after the last value. For example, these are all bad:
"Relays" : [ 0, 1, ]"People" : [ { "FirstName" : "Paul", "LastName" : "Young" } { "FirstName" : "Charlotte" "LastName" : "Richardson" }]The first example has an extra comma after the 1. The second example is missing two commas, one after the first closing curly brace and the second after Charlotte.
Misplacing commas is very easy to do, especially when cut and paste editing a configuration file.
Spacing, tabs, and new lines
Section titled “Spacing, tabs, and new lines”JSON allows spaces, tabs, and new lines anywhere except in names and values.
"Relays":[0,1]Is the same as this:
"Relays" : [ 0, 1]Spacing and lines can make the configuration file easier to read. There are many styles of indenting JSON.
Beginning and ending braces
Section titled “Beginning and ending braces”It was mentioned above that there is one exception to the rule that everything has a name and a value. The entire configuration file is a value with no name. It is a group, so the configuration file must begin with an open curly brace and end with a close curly brace.
Debugging JSON
Section titled “Debugging JSON”It can be difficult to spot errors in JSON text and the configuration file reader is not very good at explaining what is wrong. A much better file reader is online at www.jsonlint.org. You can copy and paste the entire configuration file into the website and it will usually point to where the problems are.
Configuration file lists
Section titled “Configuration file lists”The information in the configuration file is divided into nine major lists and a few miscellaneous names and values.
Templates
Section titled “Templates”The templates list describes physical antennas. It is a list of groups. Each group describes one physical antenna. It contains information such as the manufacturer and model, type, and gain and beamwidth. This information is provided to clients, which could use it to provide better graphics and icons for the antennas. There is also a future plan which may use the gain and beamwidth in the server.
At this point no client uses this information so it will not harm anything if some or all is not provided.
If there are several identical antennas, such as in a stack of yagis, only one template is needed to describe all of them. Each template group name must unique because the antennas refer to the templates by the name.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Name | Mandatory | String | Antenna name |
| Manufacturer | Optional | String | Antenna Manufacturer |
| Model | Optional | String | Antenna Model |
| Type | Optional | String | Antenna type: dipole, vertica l, yagi, etc. |
| Info | Optional | List | Frequency-specific information |
Info List
Section titled “Info List”The Info list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| LowerFrequency | Optional | Number | Lower frequency limit |
| UpperFrequency | Optional | Number | Upper frequency limit |
| Elements | Optional | Number | Number of elements |
| 3dBWidth | Optional | Number | 3 dB beamwidth |
| Lobes | Optional | Number | Number of main lobes |
Examples
Section titled “Examples”This describes a Cushcraft 15-4CD 4 element yagi
"Templates" : [ { "Name" : "Cushcraft 15CD-4", "Manufacturer" : "Cushcraft", "Model" : "15-4CD", "Type" : "yagi", "Info" : [ { "LowerFrequency" : 21000, "UpperFrequency" : 21450, "Elements" : 4, "3dBWidth" : 56, "Lobes" : 1 } ] }]This describes a homebrew 4-square
"Templates" : [ { "Name" : "80 M 4-square", "Type" : "vertical", "Info" : [ { "LowerFrequency" : 3500, "UpperFrequency" : 4000, "Elements" : 4, "3dBWidth" : 99, "Lobes" : 1 } ] }]This describes a DX Engineering (Bencher) Skyhawk tribander.
"Templates" : [ { "Name" : "Bencher Skyhawk", "Manufacturer" : "DX Engineering", "Model" : "Skyhawk", "Type" : "yagi", "Info" : [ { "LowerFrequency" : 14000, "UpperFrequency" : 14350, "Elements" : 3, "3dBWidth" : 72, "Lobes" : 1 }, { "LowerFrequency" : 21000, "UpperFrequency" : 21450, "Elements" : 3, "3dBWidth" : 72, "Lobes" : 1 }, { "LowerFrequency" : 28000, "UpperFrequency" : 29700, "Elements" : 4, "3dBWidth" : 61, "Lobes" : 1 } ] }]Antennas
Section titled “Antennas”The antennas list describes antennas which can be selected.
The radio RX antenna is designed to handle switching of receive antennas that are connected to the radio’s RX antenna. The information is passed to the client which, if it is a logging program which controls the radio, could activate or deactivate the radio’s RX Antenna connector. There is no client yet which implements this.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| ID | Required | Number | Unique number for this antenna |
| DisplayName | Optional | String | Antenna name (ignored b y the server) |
| Template | Optional | String | Antenna template |
| ShortName | Optional | String | Name of antenna |
| LongName | Optional | String | Descriptive name of antenn a |
| Enabled | Optional | Boolean | True if antenna can be sel ected |
| RXOnly | Optional | Boolean | True if antenna is receive- only |
| TXOnly | Optional | Boolean | True if antenna is transmit -only |
| NoSelect | Optional | Boolean | True if antenna should no t be considered as the best choice when changing bands |
| Inhibit | Optional | Boolean | True if transmit should be inhibited when this antenna is selected as the transmit antenna |
| SharedTX | Optional | Boolean | True if this antenna can be shared for transmit between cooperating radios |
| InUse | Optional | Number List | If antenna is part of a system, the IDs of the antennas used |
| Rotator | Optional | Number | Rotator number |
| Offset | Optional | Number | Antenna offset from rotator position in degrees or the direction if the antenna does not have a rotator |
| Alternate | Optional | Number List | Antenna numbers of a ntennas which are an alternate path for connecting to this antenna |
| Conflicts | Optional | Number List | Antennas which canno t be used when this antenna is in use |
| Control | Optional | List | Relays used to control this antenna |
| Scenarios | Optional | Number List | Scenarios where this antenna is active |
| Overrides | Optional | Number List | Antennas which allow this antenna to be selected even if there is a conflict. |
| NoHistory | Optional | Boolean | True if this antenna is not remembered when selecting. |
The antenna numbers specified in the In use list are the antenna IDs of the additive antennas which make up the antenna, if any. It is not necessary to list an antenna as using itself. And the Rotator of antennas which use others is ignored.
Control List
Section titled “Control List”The Control list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| LowerFrequency | Optional | Number | Lower frequency for these relays |
| UpperFrequency | Optional | Number | Upper frequency for these relays |
| Stations | Optional | List | Per-station and radio inform ation |
Stations List
Section titled “Stations List”The Stations list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Station | Optional | Number | Station number |
| Radio | Optional | Number | Radio number RadioRXAntenna Optional Boolean True if antenna is connected to radio RX antenna |
| Relays | Optional | Number List | Relays to select |
| RXRelays | Optional | Number List | Relays to select when receiving on this antenna (if different than TX) |
| PersistentRelays | Optional | Number List | Relays to sel ect when the other (TX or RX) antenna is part of a different group |
Examples
Section titled “Examples”This is a 40 meter beam connected to port 3 on a 2x6 switch in an SO2R station. It is mounted on rotator 1. Relay 2 selects it for radio 1 and relay 8 selects it for radio 2.
"Antennas" : [ { "ID" : 4, "Template" : "40 Beam", "ShortName" : "Beam", "LongName" : "40 Meter Beam", "InUse" : [4], "Rotator" : 1, "Offset" : 0, "Conflicts" : [4], "Fast" : [4], "Control" : [ { "LowerFrequency" : 7000, "UpperFrequency" : 7300, "Stations" : [ { "Station" : 1, "Radio" : 1, "Relays" : [2] }, { "Station" : 1, "Radio" : 2, "Relays" : [8] } ] } ] }]This is a more complicated example.
Two stations are connected to a 2x10 switch. Station 1 is relays 0-9 and station 2 is 10-19.
A stack of three tribanders is connected to a micro stack switch. The main feedline is on switch port 2 and the secondary feedline is on switch port 10.
The micro Stack Switch uses relays 20-26.
Each station has a switched bandpass filter. The filters use relays 40-45 and 50-55.
Antennas 0-6 represent the choices on the main feedline. Antennas 7-9 represent the choices on the secondary feedline.
"Antennas" : [ { "ID": 0, "Template": "Bencher Skyhawk" "ShortName" : "Top", "LongName" : "Bencher Skyhawk stack top", "InUse" : [0], "Rotator" : 1, "Offset" : 0, "Alternate" : [7], "Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ { "LowerFrequency" : 14000, "UpperFrequency" : 14350, "Stations" : [ { "Station" : 1, "Radio" : 1, "Relays" : [1, 22, 25, 27, 43], }, { "Station" : 1, "Radio" : 2, "Relays" : [11, 22, 25, 27, 53], } ] }, { "LowerFrequency" : 21000, "UpperFrequency" : 21450, "Stations" : [ { "Station" : 1, "Radio" : 1, "Relays" : [1, 22, 25, 27, 44], }, { "Station" : 1, "Radio" : 2, "Relays" : [11, 22, 25, 27, 54], } ] }, { "LowerFrequency" : 28000, "UpperFrequency" : 29700, "Stations" : [ { "Station" : 1, "Radio" : 1, "Relays" : [1, 22, 25, 27, 45], }, { "Station" : 1, "Radio" : 2, "Relays" : [11, 22, 25, 27, 55], } ] } ] }, { "ID": 1, "Template": "Bencher Skyhawk" "ShortName" : "Mid", "LongName" : "Bencher Skyhawk stack middle", "InUse" : [1], "Offset" : 45, "Alternate" : [8], "Conflicts" : [0, 1, 2, 3, 4, 5, 6, 8], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 2, "Template": "Bencher Skyhawk" "ShortName" : "Bot", "LongName" : "Bencher Skyhawk stack bottom", "InUse" : [2], "Offset" : 45, "Alternate" : [9], "Conflicts" : [0, 1, 2, 3, 4, 5, 6, 9], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 3, "Template": "Bencher Skyhawk" "ShortName" : "Top Mid", "LongName" : "Bencher Skyhawk stack top + middle",
"InUse" : [0, 1], "Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7, 8], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 4, "Template": "Bencher Skyhawk" "ShortName" : "Top Bot", "LongName" : "Bencher Skyhawk stack top + bottom", "InUse" : [0, 2], "Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7, 9], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 5, "Template": "Bencher Skyhawk" "ShortName" : "Mid Bot", "LongName" : "Bencher Skyhawk stack middle + bottom", "InUse" : [1, 2], "Conflicts" : [0, 1, 2, 3, 4, 5, 6, 8, 9], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 6, "Template": "Bencher Skyhawk" "ShortName" : "Top Mid Bot", "LongName" : "Bencher Skyhawk stack top + middle + bottom", "InUse" : [0, 1, 2], "Conflicts" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 7, "Conflicts" : [0, 3, 4, 6, 7, 8, 9], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 8, "Conflicts" : [1, 3, 5, 6, 7, 8, 9],
"Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }, { "ID": 9, "Conflicts" : [2, 4, 5, 6, 7, 8, 9], "Fast" : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "Control" : [ <omitted from example> ] }]Systems
Section titled “Systems”The systems list describes antenna systems. An antenna does not need to be part of a system. If it is not in a system, it is considered a single exclusive antenna. An antenna can be part of only one antenna system. An antenna system can be part of another antenna system. Each antenna system must have a unique ID number.
Whether an antenna behaves as an additive or exclusive antenna when selecting from a button client depends on whether its ID is in the additive or exclusive lists in the system.
The number of antennas in the system is used for display only. Use whatever number you think makes sense.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| ID | Required | Number | Unique number for this system |
| DisplayName | Optional | String | System name (ignored by the server) |
| Antennas | Optional | Number | Number of antennas in the system |
| AdditiveAntennas | Optional | Number List | Antennas which are treated as additive |
| ExclusiveAntennas | Optional | Number List | Antennas which are treated as exclusive |
| SharedAntennas | Optional | Number List | Antennas for shared use |
| AdditiveSystems | Optional | Number List | Systems which are treated as additive |
| ExclusiveSystems | Optional | Number List | Systems which are treated as exclusive |
| SharedSystems | Optional | Number List | Systems which are treated as shared (Not implemented yet) |
| Shared | Optional | Boolean | Initial state of antenna sharing |
Example
Section titled “Example”"Systems" : [ { "ID": 0, "AdditiveAntennas" : [0, 1, 2], "ExclusiveAntennas" : [3, 4, 5, 6] "SharedAntennas" : [10, 11, 12] "Shared" : False }]Scenarios
Section titled “Scenarios”The scenarios list describes scenarios. An antenna may be part of one or more scenarios, or it may not be part of any scenario. If it is not part of a scenario it is available regardless of what scenario is active.
Each scenario must have a unique ID number.
A scenario may be in conflict with other scenarios. In this case, if a scenario is active, all scenarios which are in conflict are not active.
A scenario may have conditions which describe when it will be activated. A scenario may be active when two or more radios are on the same band or are on different bands. If two scenarios are activated when radios are on the same band and they are in conflict the one selected will be determined by which radio changed bands last.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| ID | Required | Number | Unique number for this scenario HasPriority Optional Boolean True if this scenario should be preferred if multiple scenarios could be activated |
| Conflicts | Optional | Number List | Scenarios which will be inactive when this scenario is active |
| Conditions | Optional | List | Conditions where this scen ario will be activated |
| LastChanged | Optional | List | Stations which will cause this to be a preferred scenario for activation when they change bands |
Conditions List
Section titled “Conditions List”The Stations list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| SameBand | Optional | List | Radios which activate this s cenario when they are on the same band |
| DifferentBand | Optional | List | Radios which activate t his scenario when they are on different bands |
SameBand, DifferentBand, and LastChanged Lists
Section titled “SameBand, DifferentBand, and LastChanged Lists”The SameBand and DifferentBand lists contain the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Station | Optional | Number | Station number |
| Radio | Optional | Number | Radio number |
Example
Section titled “Example”"Scenarios": [ { "ID": 1, "Conflicts": [2, 3], "Conditions": [ { "DifferentBand": [ { "Station" : 1, "Radio" : 1, }, { "Station" : 1, "Radio" : 2, } ] } ] }, { "ID": 2, "Conflicts": [1, 3], "Conditions": [ { "SameBand": [ { "Station" : 1, "Radio" : 1, }, {
"Station" : 1, "Radio" : 2, } ] } ], "LastChanged": [ { "Station" : 1, "Radio" : 2, } ] }, { "ID": 3, "Conflicts": [1, 2], "Conditions": [ { "SameBand": [ { "Station" : 1, "Radio" : 1, }, { "Station" : 1, "Radio" : 2, } ] } ], "LastChanged": [ { "Station" : 1, "Radio" : 1, } ] },]Functions
Section titled “Functions”The functions list describes functions that can be made available as buttons. It is a list of groups. Each group describes one function with a set of parameters. Each function must have a unique ID number because the layout refers to functions using the ID number.
These are specific functions of the server – the server recognises them by their names. Additional functions may be added in future versions. Lists of numbers and strings tell the function what to do. It is possible to have more than one function which has the same name and uses the same server’s function but uses different numbers. For example, there could be a function which swaps the antennas of station 1 radio 1 and station 1 radio 2 and a different swap function which swaps the antennas of station 2 radio 1 and station 2 radio
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| ID | Required | Number | Unique number for this system |
| DisplayName | Optional | String | Function name (ignored by the server) |
| Name | Required | String | Function name as known by the server |
| ShortName | Optional | String | Name displayed for functi on Longname Optional String Fully descriptive name of function IntParams Optional Number List Function-specific parameters |
| StringParams | Optional | String List | Function-specific parameters There may be several functions that use the same Name but have different parameters. |
AntennaSwap
Section titled “AntennaSwap”This function swaps the antennas of the two radios if both antennas are usable on the other radio’s frequency.
The function uses a list of four numbers. The first two are the station number and radio number for one radio. The second two are the station number and radio number for another radio.
This function sets the receive antenna for a radio to the transmit antenna.
It does not use the lists of numbers and names.
This function stores the current transmit and receive antennas for a radio in memory where the Recall function can find them.
It does not use the lists of numbers and names.
Recall
Section titled “Recall”This function recalls the transmit and receive antennas stored by the Store function if they are usable on the radio’s frequency.
It does not use the lists of numbers and names.
This function changes an antenna system between shared and not shared. It is useful with antenna systems which may be shared or may have their individual antennas split among several radios. An example would be a stack of tribanders with a triplexer and switching that allows the tribanders to be connected to the triplexer or to individual radios.
This function uses a list of numbers. The first number is the ID of the antenna system which will be switched between shared and not shared. Any other numbers are IDs of non-shared antennas which will be assigned preferentially to the radios when the antenna system is changed from shared to not shared. The preferred antenna IDs are only necessary if it is desired to override the function’s default selections of antennas for the radios.
This function turns a relay on or off. The relay is not part of an antenna.
This function uses a list of numbers. The first number is the relay number to turn on or off. It may be the only number specified. If more numbers are specified the second number is the station number and the third the radio number that this applies to. The fourth and further numbers are antenna numbers. The function will only be available when the specified radio has selected one of the specified antennas. The function also uses a list of strings if a radio is specified. The strings can be “T”, “R”, or “S”. If “T” is specified the relay can be turned on if a specified antenna is selected for transmit. If “R” is specified the relay can be turned on if a specified antenna is selected for receive. If “S” is specified the relay will be turned on if it was turned off due to an antenna selection.
Inhibit
Section titled “Inhibit”This function adds a radio to an inhibit buss or removes it from that buss.
The function uses a list of numbers. The first number is the station number. The second number is the radio number. The third number is the inhibit buss number.
This function turns a relay on when a station is transmitting. There can be constraints on when the function is available.
The function uses a list of numbers and possibly strings. The first number is the station number. The second number is the radio number. The last number is the relay number.
The string list may specify constraints.
It is possible to enable this function only when two radios would be able to swap antennas. This is useful in the case of driving transfer switching or shared amplifiers. To enable this, a list of strings must be passed with the function, one of which must be “Transfer”. In addition to this, the numbers list must contain two additional numbers before the relay number. The first number is the station number for another radio and the second number is the radio number. The function will only be available if the antennas of both radios can be swapped and if the two radios are interlocked so that when one is transmitting, the other is inhibited from transmitting.
Partner
Section titled “Partner”This function sets two radios to be partners.
The function uses a list of four numbers. The first two numbers are the station and radio numbers for one radio. The third and fourth numbers are the station and radio numbers for another radio.
AltActive
Section titled “AltActive”This function sets radios so that they will switch a radio to the alternate antenna when they transmit.
The function uses a list of at least four numbers. The first two numbers are the station and radio numbers for the radio which will be switched to the alternate antenna. Additional numbers are the station and radio numbers for stations which will switch the specified radio to the alternate antenna when they transmit.
Scenario
Section titled “Scenario”This function enables and disables scenarios.
The function uses a list of at least one number. The numbers are scenario IDs.
If one number is specified the function will enable that scenario, disabling all which are in conflict. It cannot disable the scenario. Usually if you are using this function with one scenario you will have another button that will enable a scenario which is in conflict with this one and you will use the two buttons to select one of the two scenarios.
If two numbers are specified the function will toggle between the scenarios, enabling the one which is not enabled. It will show as selected when the first scenario is active and as available when it is not.
If three or more numbers are specified the function will select the scenarios in round-robin fashion.
Other events, such as a radio changing bands, can also change which scenarios are enabled.
The function will display the changed state if applicable.
Enable
Section titled “Enable”This function enables and disables a radio.
The function uses a list of two numbers. They The function uses a list of four numbers. They are the station and radio numbers for one radio.
The function optionally uses a list of strings. One value is allowed. The value can be “Toggle”, “On”, or “Off”. If “Toggle” is specified or no value is specified pressing the button will alternate between enabled and disabled. If “ON” is specified the function will enable the radio and it cannot disable the radio. If “OFF” is specified the function will disable the radio and it cannot enable the radio.
If “On” or “Off” are used then two functions are necessary to enable and disable the radio.
Examples
Section titled “Examples”This is one example of each of the functions.
"Functions" : [ { "ID": 0, "Name" : "AntennaSwap", "ShortName" : "Swap", "LongName" : "Swap antennas between radios 1 and 2", "IntParams" : [1, 1, 1, 2], "StringParams" : [] }, { "ID": 1, "Name" : "RXTX", "ShortName" : "RX=TX", "LongName" : "Set RX antenna to TX", "IntParams" : [], "StringParams" : [] }, { "ID": 2, "Name" : "Store", "ShortName" : "Store", "LongName" : "Store current TX and RX antennas", "IntParams" : [], "StringParams" : [] }, { "ID": 3, "Name" : "Recall", "ShortName" : "Recall", "LongName" : "Recall stored TX and RX antennas", "IntParams" : [], "StringParams" : [] }, { "ID": 4, "Name" : "Share", "ShortName" : "Share", "LongName" : "Share tribander stack between two stations", "IntParams" : [0], "StringParams" : [] }, { "ID" : 5, "Name" : "Relay", "ShortName" : "Coffee", "LongName" : "Turn coffee pot on or off", "IntParams" : [30], "StringParams" : [] }, { "ID" : 6, "Name" : "Relay", "ShortName" : "Amp", "LongName" : "Turn amplifier on or off", "IntParams" : [31, 1, 1, 2, 3], "StringParams" : ["T", "S"] }, { "ID" : 7, "Name" : "Inhibit", "ShortName" : "Inhibit 20", "LongName" : "Inhibit Radio 1 on 20", "IntParams" : [1, 1, 20], "StringParams" : [] }, { "ID" : 8, "Name" : "Extra", "ShortName" : "Xfer Relay", "LongName" : "Transfer Relay Radio 1", "IntParams" : [2, 1, 1, 1, 55], "StringParams" : ["Transfer"] }, { "ID" : 9, "Name" : "Partner", "ShortName" : "Partner", "LongName" : "Partner 1 and 2", "IntParams" : [1, 1, 1, 2], "StringParams" : [] }, { "ID" : 10, "Name" : "AltActive", "ShortName" : "Alt Active", "LongName" : "Set Alternate radios", "IntParams" : [1, 1, 2, 1, 3, 1], "StringParams" : [] }, { "ID" : 11, "Name" : "Scenario", "ShortName" : "Scenario", "LongName" : "Change Scenario", "IntParams" : [1, 2], "StringParams" : [] }, { "ID" : 12, "Name" : "Enable", "ShortName" : "Enabled", "LongName" : "Enable radio 1", "IntParams" : [1, 1], "StringParams" : [] }]Relay Groups
Section titled “Relay Groups”The RelayGroups list describes relay groups. A relay group is a list of relays that can be turned on and off and the conditions where they may change.
It is a list of groups. Each group describes one set of relays. Each relay group must have a unique ID number because the layouts refer to the relay group using the ID number.
Relay groups have a long name and a short name. The short name is put on buttons. If the short name is too long it won’t fit. A length of a dozen or so characters is probably OK. It is difficult to give a general rule because some characters are much wider than others.
A relay group as three states, Unavailable, Available, and Selected. Availability is determined by various items in the list.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| ID | Required | Number | Unique number for this relay group |
| ShortName | Optional | String | Name of relay group |
| LongName | Optional | String | Descriptive name of relay group |
| AlwaysSelected | Optional | Boolean | True if relay group is always selected when available |
| Memory | Optional | Boolean | True if last available/selected state is remembered and restored |
| Unavailable | Optional | Number List | Relays to select if the relay group is unavailable |
| Groups | Optional | List | Relays and selection criteria |
The Groups information is used to determine if the relay group is available or selected and to specify which relays are to be activated.
Groups List
Section titled “Groups List”The Groups list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Station | Optional | Number | Station number |
| Radio | Optional | Number | Radio number |
| Control | Optional | List | Relays and selection criteria |
Control
Section titled “Control”The Control list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| LowerFrequency | Optional | Number | Lowest frequency where relay group is available |
| UpperFrequency | Optional | Number | Hightest frequency where relay group is available |
| Scenarios | Optional | Number List | Scenarios where relay group is available |
| TxAntennas | Optional | Number List | Transmit antennas where relay group is available |
| RxAntennas | Optional | Number List | Receive antennas where relay group is available |
| Available | Optional | Number List | Relays to select when relay group is available |
| Selected | Optional | Number List | Relays to select when relay group is selected |
| TxSelected | Optional | Number List | Relays to select during transmit when relay group is selected |
| RxSelected | Optional | Number List | Relays to select during receive when relay group is selected |
LowerFrequency, UpperFrequency, TxAntannas, RxAntennas, TXSelected, and RXSelected are not available unless the Groups List contains a Station and Radio.
The relays are only selected if this control meets the selection criteria (frequencies, scenarios etc). They will not be selected if another control meets selection criteria.
Examples
Section titled “Examples”This example shows a relay group where relay 1 will be active if scenario 0 is active. It is not normally used with a layout.
"RelayGroups": [{ "ID": 0, "ShortName": "Scenario 1 relay", "LongName": "Scenario 1 relay", "AlwaysSelected": true, "Groups": [ { "Control": [ { "Scenarios": [ 0 ], "Selected": [ 1 ] } ] } ]}]This example shows a relay group where different relays will be selected depending on the frequency of station 1 radio 1, and for ten meters, which antenna is selected.
"RelayGroups": [{ "ID": 0, "ShortName": "AMP 1", "LongName": "High Band Amplifier", "Memory": true, "Unavailable": [ 50, 51 ], "Groups": [ { "Station": 1, "Radio": 1, "Control": [ { "LowerFrequency": 14000, "UpperFrequency": 14350, "Available": [ 52 ], "Selected": [ 53, 54 ], "TxSelected": [ 55, ], "RxSelected": [ 56, 57 ] }, { "LowerFrequency": 21000, "UpperFrequency": 21450, "Available": [ 42 ], "Selected": [ 43, 44 ], "TxSelected": [ 45 ], "RxSelected": [ 46, 47 ] }, { "LowerFrequency": 28000, "UpperFrequency": 29700, "TxAntennas": [ 0, 7, 14, 21 ], "Available": [ 60 ], "Selected": [ 61 ], "TxSelected": [ 62 ], "RxSelected": [ 63 ] } ] } ]}]Layout
Section titled “Layout”The layout list describes button or knob layouts which can be used by a client. It is a list of groups. Each group describes one layout. Layouts do not have an ID.
Each button is identified by a row and a column. The top left button is row 0 column 0.
flowchart LR
B1[Row 0<br>Column 0] ~~~ B2[Row 0<br>Column 1]
B3[Row 1<br>Column 0] ~~~ B4[Row 1<br>Column 1]
A knob client has only one row. Turning the knob to the right selects the next layout item. Turning the knob to the left selects the previous layout item. Turning past the end of the list of items wraps back to the other end of the list.
If a station and radio number are not provided then the layout will be used by all stations and radios.
If a row and column is not used it does not need an entry. The client will not put a button in a place where no antenna or function is specified.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Rows | Optional | Number | Number of rows |
| Columns | Optional | Number | Number of columns |
| Station | Optional | Number | Station number |
| Radio | Optional | Number | Radio number |
| Matrix | Optional | List | Button information |
Matrix
Section titled “Matrix”The matrix list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| LowerFrequency | Optional | Number | Lower frequency limit |
| UpperFrequency | Optional | Number | Upper frequency limit |
| Buttons | Optional | List | Button position and function If the frequencies are not specified the entry applies to all frequencies. This might be used, for example, to set up function buttons which are always displayed. |
Buttons
Section titled “Buttons”The buttons list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Row | Required | Number | Button row |
| Column | Required | Number | Button column |
| Type | Required | String | Must be Antenna or Function |
| ID | Required | Number | Identifier of antenna or function |
Examples
Section titled “Examples”This layout shows an 80 meter 4-square.
"Layout" : [ { "Rows" : 4, "Columns" : 3, "Station" : 1, "Matrix" : [ {
"LowerFrequency" : 3500, "UpperFrequency" : 4000, "Buttons" : [ { "Row" : 0, "Column" : 0, "Type" : "Antenna", "ID" : 3 }, { "Row" : 0, "Column" : 1, "Type" : "Antenna", "ID" : 2 }, { "Row" : 1, "Column" : 0, "Type" : "Antenna", "ID" : 0 }, { "Row" : 1, "Column" : 1, "Type" : "Antenna", "ID" : 1 } ] } ] }]This example shows a layout with two antennas for 20-10 meters and two functions which will appear no matter what frequency the radio is using.
"Layout" : [ { "Rows" : 5, "Columns" : 2, "Station" : 1, "Radio" : 1, "Matrix" : [ { "LowerFrequency" : 14000, "UpperFrequency" : 29700, "Buttons" : [ { "Row" : 0, "Column" : 0,
"Type" : "Antenna", "ID" : 6 }, { "Row" : 0, "Column" : 1, "Type" : "Antenna", "ID" : 0 }, ] }, { "Buttons" : [ { "Row" : 1, "Column" : 2, "Type" : "Function", "ID" : 3 }, "Buttons" : [ { "Row" : 1, "Column" : 3, "Type" : "Function", "ID" : 4 }, ] } ] }]RelativeAntennas
Section titled “RelativeAntennas”The relative antennas list describes which antennas to use with a relative client. It is a list of groups. Each group describes relative antennas for one or more stations. Relative antennas do not have an ID.
These describe which antennas to use as relative antennas for logging programs.
If the station and radio are not supplied the antennas apply to all stations and radios.
Frequency ranges should not overlap.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Station | Optional | Number | Station number |
| Radio | Optional | Number | Radio number |
| Antennas | Required | List | Relative antennas |
Antennas
Section titled “Antennas”The Antennas list contains the following:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| LowerFrequency | Optional | Number | Lower frequency limit |
| UpperFrequency | Optional | Number | Upper frequency limit |
| IDs | Required | Number List | IDs of antennas, in relati ve order |
| RXIDs | Optional | Number List | IDs of receive antennas If the RXIDs are supplied the list must be the same length as the IDs. The specified antennas will be used for receive. If RXIDs are not supplied the transmit antennas will be used for receive. |
Example
Section titled “Example”This example would select the all three antennas for 20-10 meters under control of a logging program which acts as a client. They could be the most combinations of a stack of three tribanders – all, top, and bottom two.
"RelativeAntennas" : [ { "Station" : 1, "Radio" : 1, "Antennas" : [ { "LowerFrequency" : 14000, "UpperFrequency" : 29700, "IDs" : [6, 1, 5] } ] }]Rotators
Section titled “Rotators”The rotators list describes antenna rotators. Each rotator must have a unique ID number.
There are three kinds of rotators. One is a physical device. Another other is electrical, where it involves the switching of an antenna system. The third is a simulated rotator, used for testing only.
The server will deal with several types of rotator control. The type is a string which is known to the server.
The choices are:
-
Serial - A serial rotator is a physical rotator which is connected to a serial or USB port.
-
Electrical - An electrical rotator is a virtual rotator for a system which can be electrically switched to different directions, such as a four square.
-
Test - A test rotator is a simulated rotator used for testing. The rotator turns at ten degrees per second.
If the rotator is electrical then all of the antennas which use it must be part of an antenna system and all antennas within the system must specify the same rotator. When the rotator direction is changed the server will select the antenna with the offset closest to the requested direction.
If the rotator is serial then it may be connected to any computer available on the network. That computer must run the MOAS Rotator program. See appendix 1.1.1.1.1.1.B for more information about the MOAS Rotator.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| ID | Required | Number | Unique number for this rotator |
| ShortName | Optional | String | Name of rotator |
| LongName | Optional | String | Descriptive name of rotato r |
| Invisible | Optional | Boolean | True if rotator should n ot be shown to clients |
| CCWLimit | Optional | Number | Counterclockwise limit in degrees |
| Rotation | Optional | Number | Number of degrees the rotator can travel |
| Control | Optional | String | Type of rotator control |
| Address | Optional | String | Network address of the computer where the rotator is connected |
| CommPort | Optional | String | Name of communications por t where the rotator is connected |
| Model | Optional | String | Rotator model |
| Poll | Optional | Number | How often to check direction i n milliseconds |
Address, CommPort, Model, and Poll are only used if the Control is “Serial”.
Example
Section titled “Example”Rotator 0 turns a triband beam. Rotator 1 is a 9-circle receiving antenna. And rotator 2 turns a side mount which is limited in travel from 0 to 300 degrees.
"Rotators" : [ { "ID": 0, "ShortName" : "Tribander", "LongName" : "Triband Beam on tower", "CCWLimit" : 180, "Rotation" : 360, "HasStop" : true, "Control" : "Serial", "Address" : "127.0.0.1", "CommPort" : "COM14", "Model" : "RotorEZ", "Poll" : 2000 }, { "ID": 1, "ShortName" : "9-Circle", "LongName" : "9-Circle receive array", "CCWLimit" : 0, "Rotation" : 360, "Control" : "Electrical" }, { "ID" : 2, "ShortName" : "10 side", "LongName" : "10 meter side-mount", "CCWLimit" : 0, "Rotation" : 300, "Control" : "Test" }]Radios
Section titled “Radios”The radios list describes the radios. Each radio must have a unique station and radio number.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Station | Required | Number | Station number |
| Radio | Required | Number | Radio number |
| SubReceiver | Optional | Number | Radio number of sub receiver |
| PersistSubReceiver | Optional | Boolean | True if the sub receiver relays should remain set during transmit |
| UseMainFreq | Optional | Boolean | True if the subreceive r antenna selection should be based on the main radio frequency |
| AltReceiver | Optional | Number | Radio number of alterna te receiver |
| Interrupt | Optional | Boolean | True if interrupt mode, False if wait mode |
| InterruptModeDelay | Optional | Number | Interrupt mode d elay |
| Always | Optional | List | Inhibit this station when one of these stations transmits |
| SameBand | Optional | List | Inhibit this station when on e of these stations transmit within the frequency range of the receive antenna |
| Partner | Optional | List | These stations are partners f or shared transmit. Only one partner is allowed. |
| InhibitBuss | Optional | List | Inhibit buss numbers. Al l radios with the same bus number will inhibit each other. |
| Alternate | Optional | List | Alternate antennas to use f or receive if another station is within the frequency range of the receive antenna |
| AltActive | Optional | List | Stations which will cause this radio to use an alternate antenna when they transmit. |
| OutOfBand | Optional | Boolean | True if inhibit this station if there is no transmit antenna available which includes the transmit frequency |
| InhibitOnlyOnTransmit | Optional | Boolean | True if the inhibit output should be active only if the radio is transmitting |
| Switches | Required | List | Switches and switch ports |
| Relays | Optional | List | Frequencies and relays |
Switches
Section titled “Switches”This describes the Switches list:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Switch | Optional | Number | Switch number |
| Port | Required | Number | Port number (1-6) on switch Each radio has an amplifier keying line and possibly an inhibit line which are connected to one or more MOAS II switches. If there is more than one MOAS II switch the Switch number indicates which switch. It is not needed if there is only one switch. The Port number indicates which of the six amplifier keying and inhibit lines on the switch are connected to this radio. |
Alternate
Section titled “Alternate”This describes the Alternate list:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| LowerFrequency | Optional | Number | Lower frequency |
| UpperFrequency | Optional | Number | Upper frequency |
| ThisAntennas | Optional | Number List | Antennas this station might use for receive |
| OtherAntennas | Optional | Number List | Antennas other s tations might use for transmit |
| Antenna | Optional | Number | Alternate antenna to use |
Always, SameBand, Partner, AltActive
Section titled “Always, SameBand, Partner, AltActive”This describes the Always and SameBand lists:
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| Station | Required | Number | Station number |
| Radio | Required | Number | Radio number |
Relays
Section titled “Relays”This describes the relays which will be set on transmit, reset on transmit, or set on transmit and reset at end of transmit.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| LowerFrequency | Optional | Number | Lower frequency |
| UpperFrequency | Optional | Number | Upper frequency |
| Extra | Optional | Number List | Relays to be set during transmit |
| Set | Optional | Number List | Relays to be set when a st ation starts transmitting |
| Reset | Optional | Number List | Relays to be reset when a station starts transmitting |
Example
Section titled “Example”These are two radios connected in an SO2R configuration:
"Radios" : [ { "Station" : 1, "Radio" : 1, "Interrupt" : false, "Always" : [ { "Station" : 1, "Radio" : 2 } ], "OutOfBand" : true, "Switches" : [ { "Port" : 1 } ] }, { "Station" : 1, "Radio" : 2, "Interrupt" : false, "Always" : [ { "Station" : 1, "Radio" : 1 } ], "OutOfBand" : true, "Switches" : [ { "Port" : 2 } ] }]Switches
Section titled “Switches”The switches list describes the MOAS II switches. It is a list of groups. Each group describes one switch. Each switch must have a unique ID number. Switch ID numbers must be in the range 1-99.
The number of the switch is used in determining which relay numbers it controls. Switch 1 controls relays 0-63. Switch 2 controls relays 100-163, etc.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| ID | Required | Number | Switch number |
| Type | Optional | String | Type of switch |
| Transport | Optional | String | Communications transport |
| Port | Optional | String | Serial communications port information |
| Address | Optional | String | IP Address in dot form |
| Port | Optional | Number | TCP/IP port |
| Echo | Optional | Number | Number switch will send |
| InhibitTime | Optional | Number | Slow transition millise conds |
| InterruptModeDelay | Optional | Number | Interrupt mode d elay |
| IndicateTR | Optional | Boolean | Switch will send transmit and receive notifications to the MOAS server. The type, if provided, must be “MOAS II”. The transport, if provided must be “Serial” or “TCP”. Serial is the default. If Serial is used then Port is required. If TCP is used then Address and TCPPort are required. Port is the OS-specific information needed to communicate with the switch. Echo is the number the switch will send when queried. If it is not set the switch query will be ignored. |
Example
Section titled “Example”"Switches" : [ { "ID" : 1, "Port" : "COM8" }]Miscellaneous
Section titled “Miscellaneous”The miscellaneous information is not a list. It is items within the main group.
The TCP port is the port clients use to talk to the server. There is no reason to set it unless the default conflicts with another program. The default port number is 12059.
| Name | Required/Optional | Type | Meaning |
|---|---|---|---|
| TCPPort | Optional | Number | TCP/IP port |
| UDPPort | Optional | Number | UDP port for N1MM Logger |
| ProtectSameBand | Optional | Boolean | True if second station on a band should have no antenna |
| StartMOASRotator | Optional | Boolean | True if the MOAS rotator program should be started if there are any rotators which need it. |