/** * PSTRotator is a third party application (windows-only) that interfaces with dozens of antenna rotators. * It offers a way for other apps to request rotation to a specific azimuth, or a grid square. * * Other rotator control apps, like [CatRotator](https://www.pianetaradio.it/blog/catrotator/) also support this API. * * The most comprehensive API details are in this Groups.io post: * https://groups.io/g/PstRotator/message/5825 * */ GT.pstrotatorSettings = {}; function pstrotatorServiceChanged() { if (GT.pstrotatorSettings.enabled != pstrotatorCheckBox.checked) { // This setting toggles the presence of a contextual menu item in the roster, // which is constructed only during roster initialization. // // So when this setting is changed, we need to reload the entire roster window. // GT.pstrotatorSettings.enable = pstrotatorCheckBox.checked; if (GT.rosterInitialized) { try { GT.callRosterWindowHandle.window.location.reload(); } catch (e) { console.error(e); } } } GT.pstrotatorSettings.ip = pstrotatorIpInput.value; GT.pstrotatorSettings.port = pstrotatorPortInput.value; saveLogSettings(); } function aimRotator(info) { const { callObj } = info if ( GT.pstrotatorSettings.enable == true && GT.pstrotatorSettings.port > 0 && GT.pstrotatorSettings.ip.length > 4 && (callObj.distance > 0) ) { // If we have a .grid, we have a .distance and .heading, so just send the heading let payload = `${Math.round(callObj.heading)}`; try { sendUdpMessage( payload, payload.length, parseInt(GT.pstrotatorSettings.port), GT.pstrotatorSettings.ip ); if (callObj.DEcall) { addLastTraffic(`Aiming rotator at ${callObj.DEcall}`); } else { addLastTraffic(`Aiming rotator to ${callObj.heading}°`); } } catch (e) { addLastTraffic("UDP aimRotator failed"); } } }