├── LICENSE ├── Nodered ├── bobtak_gpsd.json └── bobtak_nodered_06-24-2022.json ├── Plugin ├── ATAK-Plugin-bobtak-1.0-1-4.10.0-civ-release.apk ├── ATAK-Plugin-bobtak-1.0-1-4.4.0-civ-release.apk ├── ATAK-Plugin-bobtak-1.0-1-4.5.1-civ-release.apk ├── ATAK-Plugin-bobtak-1.0-1-4.6.1-civ-release.apk └── ATAK-Plugin-bobtak-1.0-1-4.9.0-civ-release.apk └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 sniporbob 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Nodered/bobtak_gpsd.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "d61d5053caa3edff", 4 | "type": "tab", 5 | "label": "BobTAK GPSD", 6 | "disabled": false, 7 | "info": "", 8 | "env": [] 9 | }, 10 | { 11 | "id": "0f0a28bad3e1f606", 12 | "type": "gpsd", 13 | "z": "d61d5053caa3edff", 14 | "name": "", 15 | "hostname": "localhost", 16 | "port": "2947", 17 | "tpv": true, 18 | "sky": false, 19 | "info": false, 20 | "device": false, 21 | "gst": false, 22 | "att": false, 23 | "x": 170, 24 | "y": 80, 25 | "wires": [ 26 | [ 27 | "dec2817574a4e430" 28 | ] 29 | ] 30 | }, 31 | { 32 | "id": "3b54e88ac63e6bd6", 33 | "type": "debug", 34 | "z": "d61d5053caa3edff", 35 | "name": "", 36 | "active": true, 37 | "tosidebar": true, 38 | "console": false, 39 | "tostatus": false, 40 | "complete": "false", 41 | "statusVal": "", 42 | "statusType": "auto", 43 | "x": 870, 44 | "y": 160, 45 | "wires": [] 46 | }, 47 | { 48 | "id": "dec2817574a4e430", 49 | "type": "switch", 50 | "z": "d61d5053caa3edff", 51 | "name": "Filter to TPV", 52 | "property": "payload.class", 53 | "propertyType": "msg", 54 | "rules": [ 55 | { 56 | "t": "eq", 57 | "v": "TPV", 58 | "vt": "str" 59 | }, 60 | { 61 | "t": "else" 62 | } 63 | ], 64 | "checkall": "false", 65 | "repair": false, 66 | "outputs": 2, 67 | "x": 310, 68 | "y": 100, 69 | "wires": [ 70 | [ 71 | "0e2bbc84da5581cf" 72 | ], 73 | [] 74 | ] 75 | }, 76 | { 77 | "id": "bfbb86e9fe33eda8", 78 | "type": "udp out", 79 | "z": "d61d5053caa3edff", 80 | "name": "", 81 | "addr": "239.2.3.1", 82 | "iface": "", 83 | "port": "6969", 84 | "ipv": "udp4", 85 | "outport": "", 86 | "base64": false, 87 | "multicast": "multi", 88 | "x": 710, 89 | "y": 220, 90 | "wires": [] 91 | }, 92 | { 93 | "id": "6f48b01196668791", 94 | "type": "function", 95 | "z": "d61d5053caa3edff", 96 | "name": "CoT", 97 | "func": "const dt = Date.now();\nconst dtD = new Date(dt);\nconst dtD5 = new Date(dt + 14400000);\n\nmsg.payload = {\n \"event\": {\n \"$\": {\n \"version\": \"2.0\",\n \"type\": \"a-f-G-U-U-S-R\",\n \"uid\": global.get(\"mycallsign\"),\n \"time\": dtD.toISOString(),\n \"start\": dtD.toISOString(),\n \"stale\": dtD5.toISOString(),\n \"how\": \"m-g\"\n\n },\n \"detail\": [\n {\n \"contact\": [\n {\n \"$\": {\n \"callsign\": global.get(\"mycallsign\")\n }\n }],\n \"link\": [\n {\n \"$\": {\n \"uid\": \"80085\",\n \"production_time\": dtD.toISOString(),\n \"type\": \"a-f-G-U-U-S-R\",\n \"parent_callsign\": \"BOBTAK\",\n \"relation\": \"p-p\"\n }\n }],\n \"precisionlocation\": [\n {\n \"$\": {\n \"geopointsrc\": \"GPS\"\n }\n }]\n }],\n \"point\": [\n {\n \"$\": {\n \"lat\": `${msg.payload.lat}`,\n \"lon\": `${msg.payload.lon}`,\n \"hae\": `${msg.payload.altHAE}`,\n \"ce\": \"9999999.0\",\n \"le\": \"9999999.0\"\n }\n\n }\n ]\n }\n\n}\nreturn msg;", 98 | "outputs": 1, 99 | "noerr": 0, 100 | "initialize": "", 101 | "finalize": "", 102 | "libs": [], 103 | "x": 670, 104 | "y": 140, 105 | "wires": [ 106 | [ 107 | "ab23542c7f044a17" 108 | ] 109 | ] 110 | }, 111 | { 112 | "id": "ab23542c7f044a17", 113 | "type": "xml", 114 | "z": "d61d5053caa3edff", 115 | "name": "", 116 | "property": "payload", 117 | "attr": "", 118 | "chr": "", 119 | "x": 670, 120 | "y": 180, 121 | "wires": [ 122 | [ 123 | "bfbb86e9fe33eda8", 124 | "3b54e88ac63e6bd6" 125 | ] 126 | ] 127 | }, 128 | { 129 | "id": "a88cb416bfbd8d33", 130 | "type": "delay", 131 | "z": "d61d5053caa3edff", 132 | "name": "", 133 | "pauseType": "rate", 134 | "timeout": "5", 135 | "timeoutUnits": "seconds", 136 | "rate": "1", 137 | "nbRateUnits": "60", 138 | "rateUnits": "second", 139 | "randomFirst": "1", 140 | "randomLast": "5", 141 | "randomUnits": "seconds", 142 | "drop": true, 143 | "allowrate": false, 144 | "outputs": 1, 145 | "x": 680, 146 | "y": 100, 147 | "wires": [ 148 | [ 149 | "6f48b01196668791" 150 | ] 151 | ] 152 | }, 153 | { 154 | "id": "0e2bbc84da5581cf", 155 | "type": "switch", 156 | "z": "d61d5053caa3edff", 157 | "name": "", 158 | "property": "payload.mode", 159 | "propertyType": "msg", 160 | "rules": [ 161 | { 162 | "t": "gt", 163 | "v": "1", 164 | "vt": "str" 165 | }, 166 | { 167 | "t": "else" 168 | } 169 | ], 170 | "checkall": "false", 171 | "repair": false, 172 | "outputs": 2, 173 | "x": 470, 174 | "y": 100, 175 | "wires": [ 176 | [ 177 | "a88cb416bfbd8d33" 178 | ], 179 | [] 180 | ] 181 | } 182 | ] -------------------------------------------------------------------------------- /Nodered/bobtak_nodered_06-24-2022.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": "8b54ee4c.ea65c", 4 | "type": "tab", 5 | "label": "BobTAK", 6 | "disabled": false, 7 | "info": "" 8 | }, 9 | { 10 | "id": "f5dc25f9.a5649", 11 | "type": "group", 12 | "z": "8b54ee4c.ea65c", 13 | "name": "Geochat", 14 | "style": { 15 | "stroke": "#92d04f", 16 | "label": true 17 | }, 18 | "nodes": [ 19 | "1c6839c7.757bee", 20 | "6c4d9885.59c0e", 21 | "b1fcec9e.27957", 22 | "403cfa9e.cfa7bc", 23 | "803b23a6.0f6758", 24 | "1f118938943677a0", 25 | "3dd3b19243ce47d9", 26 | "12834b2af9c8aeef", 27 | "728e884ee8f0fbdd", 28 | "ce134ad32cfaa1b6", 29 | "3dd3083e1eb7121c", 30 | "f45ca8af34c2c8d5", 31 | "e779a5deb9dbe464", 32 | "7fce549521b78999", 33 | "e6a87d2348ce4cc1" 34 | ], 35 | "x": 954, 36 | "y": 1279, 37 | "w": 1482, 38 | "h": 262 39 | }, 40 | { 41 | "id": "254eac17e94fc317", 42 | "type": "group", 43 | "z": "8b54ee4c.ea65c", 44 | "name": "Multicast Out", 45 | "style": { 46 | "label": true 47 | }, 48 | "nodes": [ 49 | "b8f62473379e71df", 50 | "68953fb3e90a1761", 51 | "520d7c534c5146c8", 52 | "ce2290e97c4b972a" 53 | ], 54 | "x": 1994, 55 | "y": 979, 56 | "w": 272, 57 | "h": 122 58 | }, 59 | { 60 | "id": "d8f5bb9088f1ce55", 61 | "type": "group", 62 | "z": "8b54ee4c.ea65c", 63 | "name": "2525C", 64 | "style": { 65 | "stroke": "#bfdbef", 66 | "label": true 67 | }, 68 | "nodes": [ 69 | "b50af0dc.c23678", 70 | "6bff8cc0.53ae24", 71 | "b06c793abd4cb6c5", 72 | "dede6a21df541b1d", 73 | "abf171300f0f917b", 74 | "4293e1e285423ebc", 75 | "0298b40d237dc9a4" 76 | ], 77 | "x": 948, 78 | "y": 879, 79 | "w": 984, 80 | "h": 242 81 | }, 82 | { 83 | "id": "6b96f7fd166dd3d7", 84 | "type": "group", 85 | "z": "8b54ee4c.ea65c", 86 | "name": "Obtain pure message text", 87 | "style": { 88 | "stroke": "#3f3f3f", 89 | "label": true 90 | }, 91 | "nodes": [ 92 | "80ef503301041999", 93 | "c28984d8e24352c0", 94 | "93088c0f80eebb1e", 95 | "bb3d0b05206f172b", 96 | "4099e26f3839f67e", 97 | "82caa97e934cd247" 98 | ], 99 | "x": 74, 100 | "y": 1639, 101 | "w": 1012, 102 | "h": 122 103 | }, 104 | { 105 | "id": "5ec0d079efd20beb", 106 | "type": "group", 107 | "z": "8b54ee4c.ea65c", 108 | "name": "TX.TEXT debug - Obtain pure message text", 109 | "style": { 110 | "stroke": "#3f3f3f", 111 | "label": true 112 | }, 113 | "nodes": [ 114 | "65a1ddd1b49e0772", 115 | "c0308c2c6ae10a1a", 116 | "501769a9dfd19495", 117 | "38f69ab9b13da07e", 118 | "75125c7085f21e84", 119 | "37b3df945dc35c96", 120 | "8143a92a8e362b1d" 121 | ], 122 | "x": 74, 123 | "y": 1899, 124 | "w": 942, 125 | "h": 82 126 | }, 127 | { 128 | "id": "5b352d1787ba366a", 129 | "type": "group", 130 | "z": "8b54ee4c.ea65c", 131 | "name": "TX configure geochat JS8call group", 132 | "style": { 133 | "stroke": "#6f2fa0", 134 | "label": true 135 | }, 136 | "nodes": [ 137 | "1ab91bc8560a9188", 138 | "ed5a3b3863b5385b", 139 | "89cd6073df0b8d32", 140 | "536eb58a44e4fc48", 141 | "eb1f747bead120a5" 142 | ], 143 | "x": 2154, 144 | "y": 59, 145 | "w": 642, 146 | "h": 122 147 | }, 148 | { 149 | "id": "4f0ebd4782d45849", 150 | "type": "group", 151 | "z": "8b54ee4c.ea65c", 152 | "name": "TX configure pli JS8call group", 153 | "style": { 154 | "stroke": "#6f2fa0", 155 | "label": true 156 | }, 157 | "nodes": [ 158 | "755b419c2bebddd5", 159 | "e4d8ea31a3950453", 160 | "4779f53da636c316", 161 | "7d9a281b184ee894", 162 | "494b9a383961e724" 163 | ], 164 | "x": 2154, 165 | "y": 199, 166 | "w": 642, 167 | "h": 122 168 | }, 169 | { 170 | "id": "359c668394a8e40c", 171 | "type": "group", 172 | "z": "8b54ee4c.ea65c", 173 | "name": "2525C", 174 | "style": { 175 | "stroke": "#0070c0", 176 | "label": true 177 | }, 178 | "nodes": [ 179 | "f91d86aad6f21218" 180 | ], 181 | "x": 1254, 182 | "y": 239, 183 | "w": 82, 184 | "h": 82 185 | }, 186 | { 187 | "id": "b0dff7256fa3aa44", 188 | "type": "group", 189 | "z": "8b54ee4c.ea65c", 190 | "name": "Create Maidenhead", 191 | "style": { 192 | "stroke": "#ffefbf", 193 | "label": true 194 | }, 195 | "nodes": [ 196 | "367e8f7477adf203", 197 | "470aa654060aeb9f", 198 | "ee65ac27d1748118" 199 | ], 200 | "x": 2154, 201 | "y": 339, 202 | "w": 362, 203 | "h": 82 204 | }, 205 | { 206 | "id": "1ec75a897fad92ff", 207 | "type": "group", 208 | "z": "8b54ee4c.ea65c", 209 | "name": "Type 2525C", 210 | "style": { 211 | "stroke": "#0070c0", 212 | "label": true 213 | }, 214 | "nodes": [ 215 | "51bed90fe56b8ba1", 216 | "1d26247fa1916339", 217 | "1b75dd0903f69888", 218 | "32613f47cac9874a", 219 | "6446d7a3969bd6a4", 220 | "a53ef850deda9c67", 221 | "b9cd668bc0c33938" 222 | ], 223 | "x": 2154, 224 | "y": 439, 225 | "w": 1242, 226 | "h": 82 227 | }, 228 | { 229 | "id": "f373302b37579192", 230 | "type": "group", 231 | "z": "8b54ee4c.ea65c", 232 | "name": "Type Spot", 233 | "style": { 234 | "stroke": "#ffff00", 235 | "label": true 236 | }, 237 | "nodes": [ 238 | "54fc24c83a9842d7", 239 | "286bad5908c4b4c7", 240 | "074900fadc9e3fe4", 241 | "fb736a616b77a9f1", 242 | "33be524aac971e24", 243 | "12797457b0227b27", 244 | "7bb24ad8d7c37980" 245 | ], 246 | "x": 2154, 247 | "y": 539, 248 | "w": 1242, 249 | "h": 82 250 | }, 251 | { 252 | "id": "2ccd90acf36c6d03", 253 | "type": "group", 254 | "z": "8b54ee4c.ea65c", 255 | "name": "Spot", 256 | "style": { 257 | "stroke": "#ffff00", 258 | "label": true 259 | }, 260 | "nodes": [ 261 | "643411502d43d581" 262 | ], 263 | "x": 1254, 264 | "y": 319, 265 | "w": 82, 266 | "h": 82 267 | }, 268 | { 269 | "id": "466f58d6f321e8bc", 270 | "type": "group", 271 | "z": "8b54ee4c.ea65c", 272 | "name": "Spot Map", 273 | "style": { 274 | "stroke": "#ffffbf", 275 | "label": true 276 | }, 277 | "nodes": [ 278 | "e7436f4e11e44234", 279 | "627aded5e71ed0b2", 280 | "ede570fd6fec4f3c", 281 | "f0d9c6b02a50a38d", 282 | "03fcda2aa1f2eb84", 283 | "f5e7afc455430464" 284 | ], 285 | "x": 974, 286 | "y": 1139, 287 | "w": 782, 288 | "h": 122 289 | }, 290 | { 291 | "id": "7565a618f2df4784", 292 | "type": "group", 293 | "z": "8b54ee4c.ea65c", 294 | "name": "Type Self", 295 | "style": { 296 | "stroke": "#ff0000", 297 | "label": true 298 | }, 299 | "nodes": [ 300 | "90f268492d7b9875", 301 | "6cab27ea19a8d831", 302 | "786d9dc432ef1046", 303 | "c8dc18ab683aa5b9", 304 | "c00c1e0fb92ec026" 305 | ], 306 | "x": 2154, 307 | "y": 639, 308 | "w": 802, 309 | "h": 82 310 | }, 311 | { 312 | "id": "4b44f3641f5b8a04", 313 | "type": "group", 314 | "z": "8b54ee4c.ea65c", 315 | "name": "Self", 316 | "style": { 317 | "stroke": "#ff0000", 318 | "label": true 319 | }, 320 | "nodes": [ 321 | "49dc9cd640d1dad4" 322 | ], 323 | "x": 1254, 324 | "y": 399, 325 | "w": 82, 326 | "h": 82 327 | }, 328 | { 329 | "id": "36d556d56b82cc52", 330 | "type": "group", 331 | "z": "8b54ee4c.ea65c", 332 | "name": "Self", 333 | "style": { 334 | "stroke": "#ffbfbf", 335 | "label": true 336 | }, 337 | "nodes": [ 338 | "855378e38d24f6e3", 339 | "b06138e83e320d1a", 340 | "9a8fef750361e618", 341 | "c8514e2834071e93", 342 | "14b74d085c975762", 343 | "e8ca1074ada9bc07" 344 | ], 345 | "x": 1134, 346 | "y": 1559, 347 | "w": 782, 348 | "h": 122 349 | }, 350 | { 351 | "id": "4293e1e285423ebc", 352 | "type": "group", 353 | "z": "8b54ee4c.ea65c", 354 | "g": "d8f5bb9088f1ce55", 355 | "name": "Lowercase 2525C Attitude", 356 | "style": { 357 | "stroke": "#000000", 358 | "label": true 359 | }, 360 | "nodes": [ 361 | "aa10e03fca25dfa5", 362 | "1b8a82de050726b5", 363 | "b62bd9ddec8c5ed5", 364 | "563cedc7709d7e67", 365 | "5226d5209bd8e64a", 366 | "15020e8ad2052312", 367 | "b6837bc29c229ca2" 368 | ], 369 | "x": 974, 370 | "y": 919, 371 | "w": 932, 372 | "h": 122 373 | }, 374 | { 375 | "id": "912da804.97fd", 376 | "type": "debug", 377 | "z": "8b54ee4c.ea65c", 378 | "name": "JS8call debug", 379 | "active": true, 380 | "tosidebar": true, 381 | "console": false, 382 | "tostatus": false, 383 | "complete": "true", 384 | "targetType": "full", 385 | "statusVal": "", 386 | "statusType": "auto", 387 | "x": 800, 388 | "y": 360, 389 | "wires": [] 390 | }, 391 | { 392 | "id": "5f37842d.c5556c", 393 | "type": "udp in", 394 | "z": "8b54ee4c.ea65c", 395 | "name": "", 396 | "iface": "", 397 | "port": "2242", 398 | "ipv": "udp4", 399 | "multicast": "false", 400 | "group": "", 401 | "datatype": "utf8", 402 | "x": 80, 403 | "y": 360, 404 | "wires": [ 405 | [ 406 | "5d242ba5.ad0d0c" 407 | ] 408 | ] 409 | }, 410 | { 411 | "id": "d728560d.a8bb78", 412 | "type": "udp out", 413 | "z": "8b54ee4c.ea65c", 414 | "name": "To JS8call", 415 | "addr": "127.0.0.1", 416 | "iface": "", 417 | "port": "", 418 | "ipv": "udp4", 419 | "outport": "", 420 | "base64": false, 421 | "multicast": "false", 422 | "x": 2050, 423 | "y": 260, 424 | "wires": [] 425 | }, 426 | { 427 | "id": "a34a5e85.4ea57", 428 | "type": "inject", 429 | "z": "8b54ee4c.ea65c", 430 | "name": "tx.set_text", 431 | "props": [ 432 | { 433 | "p": "payload" 434 | } 435 | ], 436 | "repeat": "", 437 | "crontab": "", 438 | "once": false, 439 | "onceDelay": 0.1, 440 | "topic": "", 441 | "payload": "{\"type\":\"TX.SET_TEXT\",\"value\":\"TEST6\"}", 442 | "payloadType": "str", 443 | "x": 1520, 444 | "y": 80, 445 | "wires": [ 446 | [ 447 | "a27e101a.d77fd8" 448 | ] 449 | ] 450 | }, 451 | { 452 | "id": "8f9d2e68.eff7", 453 | "type": "inject", 454 | "z": "8b54ee4c.ea65c", 455 | "name": "mode.get_speed", 456 | "props": [ 457 | { 458 | "p": "payload" 459 | } 460 | ], 461 | "repeat": "", 462 | "crontab": "", 463 | "once": false, 464 | "onceDelay": 0.1, 465 | "topic": "", 466 | "payload": "{\"type\":\"MODE.GET_SPEED\"}", 467 | "payloadType": "str", 468 | "x": 1540, 469 | "y": 120, 470 | "wires": [ 471 | [ 472 | "a27e101a.d77fd8" 473 | ] 474 | ] 475 | }, 476 | { 477 | "id": "5d242ba5.ad0d0c", 478 | "type": "change", 479 | "z": "8b54ee4c.ea65c", 480 | "name": "", 481 | "rules": [ 482 | { 483 | "t": "set", 484 | "p": "js8calludpport", 485 | "pt": "flow", 486 | "to": "port", 487 | "tot": "msg" 488 | } 489 | ], 490 | "action": "", 491 | "property": "", 492 | "from": "", 493 | "to": "", 494 | "reg": false, 495 | "x": 280, 496 | "y": 360, 497 | "wires": [ 498 | [ 499 | "1fdd7736.c85879" 500 | ] 501 | ] 502 | }, 503 | { 504 | "id": "1fdd7736.c85879", 505 | "type": "json", 506 | "z": "8b54ee4c.ea65c", 507 | "name": "", 508 | "property": "payload", 509 | "action": "", 510 | "pretty": false, 511 | "x": 450, 512 | "y": 360, 513 | "wires": [ 514 | [ 515 | "ff1ad16a.06f448", 516 | "c718df7ee7a9ffeb" 517 | ] 518 | ] 519 | }, 520 | { 521 | "id": "ff1ad16a.06f448", 522 | "type": "switch", 523 | "z": "8b54ee4c.ea65c", 524 | "name": "API Type", 525 | "property": "payload.type", 526 | "propertyType": "msg", 527 | "rules": [ 528 | { 529 | "t": "eq", 530 | "v": "PING", 531 | "vt": "str" 532 | }, 533 | { 534 | "t": "eq", 535 | "v": "MODE.SPEED", 536 | "vt": "str" 537 | }, 538 | { 539 | "t": "eq", 540 | "v": "RIG.FREQ", 541 | "vt": "str" 542 | }, 543 | { 544 | "t": "eq", 545 | "v": "RX.SPOT", 546 | "vt": "str" 547 | }, 548 | { 549 | "t": "eq", 550 | "v": "RX.DIRECTED", 551 | "vt": "str" 552 | }, 553 | { 554 | "t": "eq", 555 | "v": "TX.TEXT", 556 | "vt": "str" 557 | } 558 | ], 559 | "checkall": "true", 560 | "repair": false, 561 | "outputs": 6, 562 | "x": 140, 563 | "y": 460, 564 | "wires": [ 565 | [ 566 | "ec5bec5e.27c76" 567 | ], 568 | [ 569 | "b7cc31ef.cf5bf8" 570 | ], 571 | [ 572 | "600b2c15.e1bbec" 573 | ], 574 | [ 575 | "d1fa4945.716b4" 576 | ], 577 | [ 578 | "9c778c79dabd638a" 579 | ], 580 | [] 581 | ] 582 | }, 583 | { 584 | "id": "9101722a.023538", 585 | "type": "switch", 586 | "z": "8b54ee4c.ea65c", 587 | "name": "Mode.Speed", 588 | "property": "payload.params.SPEED", 589 | "propertyType": "msg", 590 | "rules": [ 591 | { 592 | "t": "eq", 593 | "v": "0", 594 | "vt": "str" 595 | }, 596 | { 597 | "t": "eq", 598 | "v": "1", 599 | "vt": "str" 600 | }, 601 | { 602 | "t": "eq", 603 | "v": "2", 604 | "vt": "str" 605 | }, 606 | { 607 | "t": "eq", 608 | "v": "3", 609 | "vt": "str" 610 | }, 611 | { 612 | "t": "eq", 613 | "v": "4", 614 | "vt": "str" 615 | } 616 | ], 617 | "checkall": "true", 618 | "repair": false, 619 | "outputs": 5, 620 | "x": 530, 621 | "y": 580, 622 | "wires": [ 623 | [ 624 | "92ea3e81.cb3c8" 625 | ], 626 | [ 627 | "2a568926.ffaa5e" 628 | ], 629 | [ 630 | "3e8e6b32.6c0db4" 631 | ], 632 | [ 633 | "4a749756.e88148" 634 | ], 635 | [ 636 | "664331ae.e17df" 637 | ] 638 | ] 639 | }, 640 | { 641 | "id": "92ea3e81.cb3c8", 642 | "type": "change", 643 | "z": "8b54ee4c.ea65c", 644 | "name": "Normal", 645 | "rules": [ 646 | { 647 | "t": "set", 648 | "p": "desc", 649 | "pt": "msg", 650 | "to": "Normal", 651 | "tot": "str" 652 | } 653 | ], 654 | "action": "", 655 | "property": "", 656 | "from": "", 657 | "to": "", 658 | "reg": false, 659 | "x": 720, 660 | "y": 500, 661 | "wires": [ 662 | [ 663 | "cee256b5.34c638" 664 | ] 665 | ] 666 | }, 667 | { 668 | "id": "2a568926.ffaa5e", 669 | "type": "change", 670 | "z": "8b54ee4c.ea65c", 671 | "name": "Fast", 672 | "rules": [ 673 | { 674 | "t": "set", 675 | "p": "desc", 676 | "pt": "msg", 677 | "to": "Fast", 678 | "tot": "str" 679 | } 680 | ], 681 | "action": "", 682 | "property": "", 683 | "from": "", 684 | "to": "", 685 | "reg": false, 686 | "x": 710, 687 | "y": 540, 688 | "wires": [ 689 | [ 690 | "cee256b5.34c638" 691 | ] 692 | ] 693 | }, 694 | { 695 | "id": "3e8e6b32.6c0db4", 696 | "type": "change", 697 | "z": "8b54ee4c.ea65c", 698 | "name": "Turbo", 699 | "rules": [ 700 | { 701 | "t": "set", 702 | "p": "desc", 703 | "pt": "msg", 704 | "to": "Turbo", 705 | "tot": "str" 706 | } 707 | ], 708 | "action": "", 709 | "property": "", 710 | "from": "", 711 | "to": "", 712 | "reg": false, 713 | "x": 710, 714 | "y": 580, 715 | "wires": [ 716 | [ 717 | "cee256b5.34c638" 718 | ] 719 | ] 720 | }, 721 | { 722 | "id": "4a749756.e88148", 723 | "type": "change", 724 | "z": "8b54ee4c.ea65c", 725 | "name": "Ultra", 726 | "rules": [ 727 | { 728 | "t": "set", 729 | "p": "desc", 730 | "pt": "msg", 731 | "to": "Ultra", 732 | "tot": "str" 733 | } 734 | ], 735 | "action": "", 736 | "property": "", 737 | "from": "", 738 | "to": "", 739 | "reg": false, 740 | "x": 710, 741 | "y": 620, 742 | "wires": [ 743 | [ 744 | "cee256b5.34c638" 745 | ] 746 | ] 747 | }, 748 | { 749 | "id": "664331ae.e17df", 750 | "type": "change", 751 | "z": "8b54ee4c.ea65c", 752 | "name": "Slow", 753 | "rules": [ 754 | { 755 | "t": "set", 756 | "p": "desc", 757 | "pt": "msg", 758 | "to": "Slow", 759 | "tot": "str" 760 | } 761 | ], 762 | "action": "", 763 | "property": "", 764 | "from": "", 765 | "to": "", 766 | "reg": false, 767 | "x": 710, 768 | "y": 660, 769 | "wires": [ 770 | [ 771 | "cee256b5.34c638" 772 | ] 773 | ] 774 | }, 775 | { 776 | "id": "b7cc31ef.cf5bf8", 777 | "type": "change", 778 | "z": "8b54ee4c.ea65c", 779 | "name": "Topic Speed", 780 | "rules": [ 781 | { 782 | "t": "set", 783 | "p": "topic", 784 | "pt": "msg", 785 | "to": "speed", 786 | "tot": "str" 787 | } 788 | ], 789 | "action": "", 790 | "property": "", 791 | "from": "", 792 | "to": "", 793 | "reg": false, 794 | "x": 370, 795 | "y": 580, 796 | "wires": [ 797 | [ 798 | "9101722a.023538" 799 | ] 800 | ] 801 | }, 802 | { 803 | "id": "b7c0dd6e.06288", 804 | "type": "trigger", 805 | "z": "8b54ee4c.ea65c", 806 | "name": "Connected (rx'd ping)", 807 | "op1": "Connected", 808 | "op2": "Disconnected", 809 | "op1type": "str", 810 | "op2type": "str", 811 | "duration": "30", 812 | "extend": true, 813 | "overrideDelay": false, 814 | "units": "s", 815 | "reset": "", 816 | "bytopic": "all", 817 | "topic": "topic", 818 | "outputs": 1, 819 | "x": 600, 820 | "y": 440, 821 | "wires": [ 822 | [ 823 | "e064cdca.3365a8" 824 | ] 825 | ] 826 | }, 827 | { 828 | "id": "ec5bec5e.27c76", 829 | "type": "change", 830 | "z": "8b54ee4c.ea65c", 831 | "name": "Topic Connection", 832 | "rules": [ 833 | { 834 | "t": "set", 835 | "p": "topic", 836 | "pt": "msg", 837 | "to": "connection", 838 | "tot": "str" 839 | } 840 | ], 841 | "action": "", 842 | "property": "", 843 | "from": "", 844 | "to": "", 845 | "reg": false, 846 | "x": 390, 847 | "y": 440, 848 | "wires": [ 849 | [ 850 | "b7c0dd6e.06288" 851 | ] 852 | ] 853 | }, 854 | { 855 | "id": "cee256b5.34c638", 856 | "type": "change", 857 | "z": "8b54ee4c.ea65c", 858 | "name": "", 859 | "rules": [ 860 | { 861 | "t": "set", 862 | "p": "payload", 863 | "pt": "msg", 864 | "to": "{$.topic:$.desc}", 865 | "tot": "jsonata" 866 | } 867 | ], 868 | "action": "", 869 | "property": "", 870 | "from": "", 871 | "to": "", 872 | "reg": false, 873 | "x": 1040, 874 | "y": 560, 875 | "wires": [ 876 | [ 877 | "d75c3dbe.66403" 878 | ] 879 | ] 880 | }, 881 | { 882 | "id": "e064cdca.3365a8", 883 | "type": "change", 884 | "z": "8b54ee4c.ea65c", 885 | "name": "", 886 | "rules": [ 887 | { 888 | "t": "move", 889 | "p": "payload", 890 | "pt": "msg", 891 | "to": "desc", 892 | "tot": "msg" 893 | } 894 | ], 895 | "action": "", 896 | "property": "", 897 | "from": "", 898 | "to": "", 899 | "reg": false, 900 | "x": 810, 901 | "y": 440, 902 | "wires": [ 903 | [ 904 | "cee256b5.34c638" 905 | ] 906 | ] 907 | }, 908 | { 909 | "id": "d75c3dbe.66403", 910 | "type": "debug", 911 | "z": "8b54ee4c.ea65c", 912 | "name": "", 913 | "active": false, 914 | "tosidebar": true, 915 | "console": false, 916 | "tostatus": false, 917 | "complete": "false", 918 | "statusVal": "", 919 | "statusType": "auto", 920 | "x": 1250, 921 | "y": 560, 922 | "wires": [] 923 | }, 924 | { 925 | "id": "600b2c15.e1bbec", 926 | "type": "change", 927 | "z": "8b54ee4c.ea65c", 928 | "name": "Topic Freq", 929 | "rules": [ 930 | { 931 | "t": "set", 932 | "p": "topic", 933 | "pt": "msg", 934 | "to": "freq", 935 | "tot": "str" 936 | } 937 | ], 938 | "action": "", 939 | "property": "", 940 | "from": "", 941 | "to": "", 942 | "reg": false, 943 | "x": 370, 944 | "y": 740, 945 | "wires": [ 946 | [] 947 | ] 948 | }, 949 | { 950 | "id": "e8fe5080.eba8a", 951 | "type": "inject", 952 | "z": "8b54ee4c.ea65c", 953 | "name": "rig.get_freq", 954 | "props": [ 955 | { 956 | "p": "payload" 957 | } 958 | ], 959 | "repeat": "", 960 | "crontab": "", 961 | "once": false, 962 | "onceDelay": 0.1, 963 | "topic": "", 964 | "payload": "{\"type\":\"RIG.GET_FREQ\"}", 965 | "payloadType": "str", 966 | "x": 1530, 967 | "y": 160, 968 | "wires": [ 969 | [ 970 | "a27e101a.d77fd8" 971 | ] 972 | ] 973 | }, 974 | { 975 | "id": "c1b0edf6.2dc8", 976 | "type": "inject", 977 | "z": "8b54ee4c.ea65c", 978 | "name": "station.get_status", 979 | "props": [ 980 | { 981 | "p": "payload" 982 | } 983 | ], 984 | "repeat": "", 985 | "crontab": "", 986 | "once": false, 987 | "onceDelay": 0.1, 988 | "topic": "", 989 | "payload": "{\"type\":\"STATION.GET_STATUS\"}", 990 | "payloadType": "str", 991 | "x": 1540, 992 | "y": 200, 993 | "wires": [ 994 | [ 995 | "a27e101a.d77fd8" 996 | ] 997 | ] 998 | }, 999 | { 1000 | "id": "45da7a7d.e664f4", 1001 | "type": "inject", 1002 | "z": "8b54ee4c.ea65c", 1003 | "name": "station.get_info", 1004 | "props": [ 1005 | { 1006 | "p": "payload" 1007 | } 1008 | ], 1009 | "repeat": "", 1010 | "crontab": "", 1011 | "once": false, 1012 | "onceDelay": 0.1, 1013 | "topic": "", 1014 | "payload": "{\"type\":\"STATION.GET_INFO\"}", 1015 | "payloadType": "str", 1016 | "x": 1540, 1017 | "y": 240, 1018 | "wires": [ 1019 | [ 1020 | "a27e101a.d77fd8" 1021 | ] 1022 | ] 1023 | }, 1024 | { 1025 | "id": "e83b3468.51b14", 1026 | "type": "inject", 1027 | "z": "8b54ee4c.ea65c", 1028 | "name": "rx.get_band_activity", 1029 | "props": [ 1030 | { 1031 | "p": "payload" 1032 | } 1033 | ], 1034 | "repeat": "", 1035 | "crontab": "", 1036 | "once": false, 1037 | "onceDelay": 0.1, 1038 | "topic": "", 1039 | "payload": "{\"type\":\"RX.GET_BAND_ACTIVITY\"}", 1040 | "payloadType": "str", 1041 | "x": 1550, 1042 | "y": 280, 1043 | "wires": [ 1044 | [ 1045 | "a27e101a.d77fd8" 1046 | ] 1047 | ] 1048 | }, 1049 | { 1050 | "id": "d1fa4945.716b4", 1051 | "type": "change", 1052 | "z": "8b54ee4c.ea65c", 1053 | "name": "Topic Spot", 1054 | "rules": [ 1055 | { 1056 | "t": "set", 1057 | "p": "topic", 1058 | "pt": "msg", 1059 | "to": "spot", 1060 | "tot": "str" 1061 | }, 1062 | { 1063 | "t": "set", 1064 | "p": "payload.Maidenhead", 1065 | "pt": "msg", 1066 | "to": "payload.params.GRID", 1067 | "tot": "msg" 1068 | }, 1069 | { 1070 | "t": "set", 1071 | "p": "payload.callsign", 1072 | "pt": "msg", 1073 | "to": "payload.params.CALL", 1074 | "tot": "msg" 1075 | }, 1076 | { 1077 | "t": "set", 1078 | "p": "payload.time", 1079 | "pt": "msg", 1080 | "to": "", 1081 | "tot": "date" 1082 | } 1083 | ], 1084 | "action": "", 1085 | "property": "", 1086 | "from": "", 1087 | "to": "", 1088 | "reg": false, 1089 | "x": 370, 1090 | "y": 840, 1091 | "wires": [ 1092 | [ 1093 | "1ccb5570.39929b" 1094 | ] 1095 | ] 1096 | }, 1097 | { 1098 | "id": "ff468168.b344e", 1099 | "type": "function", 1100 | "z": "8b54ee4c.ea65c", 1101 | "name": "Maidenhead -> Lat, Lon", 1102 | "func": "/*\nMaidenhead Class taken from: \n https://github.com/mehmetc/Maidenhead\nAuthor: Mehmet Celik\nLicense: MIT\nCopyright: Copyright 2016 Mehmet Celik\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Mehmet Celik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nclass Maidenhead {\n constructor(lat, lon, precision = 5){\n this.lat = lat;\n this.lon = lon;\n this.precision = precision;\n }\n\n static valid(mlocation){\n if (typeof mlocation !== 'string') {\n return false;\n }\n\n if (mlocation.length < 2) {\n return false;\n }\n\n if ((mlocation.length % 2) !== 0) {\n return false;\n }\n\n var length = mlocation.length / 2;\n\n for (var counter=0; counter= 0 && heading <= 360){\n var compassBearings = [\n {\"label\": \"N\", \"start\": 0, \"end\": 11},\n {\"label\": \"NNE\", \"start\": 11, \"end\": 33},\n {\"label\": \"NE\", \"start\": 34, \"end\": 56},\n {\"label\": \"ENE\", \"start\": 57, \"end\": 78},\n {\"label\": \"E\", \"start\": 79, \"end\": 101},\n {\"label\": \"ESE\", \"start\": 102, \"end\": 123},\n {\"label\": \"SE\", \"start\": 124, \"end\": 146},\n {\"label\": \"SSE\", \"start\": 147, \"end\": 168},\n {\"label\": \"S\", \"start\": 169, \"end\": 191},\n {\"label\": \"SSW\", \"start\": 192, \"end\": 213},\n {\"label\": \"SW\", \"start\": 214, \"end\": 236},\n {\"label\": \"WSW\", \"start\": 237, \"end\": 258},\n {\"label\": \"W\", \"start\":\t259, \"end\": 281},\n {\"label\": \"WNW\", \"start\": 282, \"end\": 303},\n {\"label\": \"NW\", \"start\": 304, \"end\": 326},\n {\"label\": \"NNW\", \"start\": 327, \"end\": 348},\n {\"label\": \"N\", \"start\": 349, \"end\": 360}\n ];\n\n var result = compassBearings.find(function (element, index, array) {\n if (heading > element.start && heading < element.end) {\n return true;\n }\n return false;\n });\n\n return result ? result.label : '';\n }\n }\n\n _deg_to_rad(deg) {\n return deg / 180 * Math.PI;\n }\n\n _rad_to_deg(rad) {\n return rad / Math.PI * 180;\n }\n\n _pad_locator(){\n var length = this._locator.length / 2 ;\n\n while (length < 5) {\n if ((length%2) == 1) {\n this._locator += '55';\n }\n else {\n this._locator += 'LL';\n }\n\n length = this._locator.length / 2;\n }\n }\n\n _range_check(target, range, pos) {\n pos = Number(pos);\n if (pos < -range || pos > range){\n throw target + \" must be between -\" + range + \" and +\" + range;\n }\n\n return pos;\n }\n\n _convert_part_to_latlon(counter, divisor) {\n var grid_lon = this._locator.substr(counter*2, 1);\n var grid_lat = this._locator.substr(counter*2+1, 1);\n\n this._lat += this._l2n(grid_lat) * 10.0 / divisor;\n this._lon += this._l2n(grid_lon) * 20.0 / divisor;\n }\n\n _calculate_field(){\n this.__lat = (this.__lat/10) + 0.0000001;\n this.__lon = (this.__lon/20) + 0.0000001;\n this._locator += this._n2l(Math.floor(this.__lon)).toUpperCase() + this._n2l(Math.floor(this.__lat)).toUpperCase();\n this.__precision -= 1;\n }\n\n _calculate_values(){\n for (let counter=0; counter < this.__precision;counter++) {\n if((counter%2) == 0) {\n this._compute_locator(counter, 10);\n } else {\n this._compute_locator(counter, 24);\n }\n }\n }\n\n _compute_locator(counter, divisor){\n this.__lat = (this.__lat - Math.floor(this.__lat)) * divisor;\n this.__lon = (this.__lon - Math.floor(this.__lon)) * divisor;\n\n if ((counter%2) == 0) {\n this._locator += \"\" + Math.floor(this.__lon) + \"\" + Math.floor(this.__lat)\n } else {\n this._locator += this._n2l(Math.floor(this.__lon)) + this._n2l(Math.floor(this.__lat))\n }\n }\n\n _l2n(letter){\n if (letter.match(/[0-9]+/)) {\n return parseInt(letter);\n }else{\n return letter.toLowerCase().charCodeAt(0) - 97;\n }\n\n }\n _n2l(number){\n return String.fromCharCode(97 + number);\n }\n}\n\n// Extract Maidenhead & Callsign from CQ Call:\n//let splitCopy = msg.payload.copy.split(\" \")\n//msg.payload.Maidenhead = splitCopy.pop();\n//msg.payload.callsign = splitCopy.pop();\n\n// Extract Latitute & Longitude from Maidenhead:\nmsg.payload.location = Maidenhead.toLatLon(msg.payload.Maidenhead);\n\nreturn msg;\n", 1103 | "outputs": 1, 1104 | "noerr": 0, 1105 | "initialize": "", 1106 | "finalize": "", 1107 | "libs": [], 1108 | "x": 950, 1109 | "y": 840, 1110 | "wires": [ 1111 | [ 1112 | "953af718.6a72b8" 1113 | ] 1114 | ] 1115 | }, 1116 | { 1117 | "id": "953af718.6a72b8", 1118 | "type": "function", 1119 | "z": "8b54ee4c.ea65c", 1120 | "name": "CoT", 1121 | "func": "const dt = Date.now();\nconst dtD = new Date(dt);\nconst dtD5 = new Date(dt + 14400000);\n\nmsg.payload = {\n \"event\": {\n \"$\": { \n \"version\":\"2.0\",\n \"type\":\"a-n-G-U-U-S-R\",\n \"uid\":`${msg.payload.params.FROM}`,\n \"time\":dtD.toISOString(),\n \"start\":dtD.toISOString(),\n \"stale\":dtD5.toISOString(),\n \"how\":\"m-g\"\n\n },\n \"detail\": [\n {\n \"remarks\": \"JS8 Station SNR: \"+`${msg.payload.params.SNR}`\n }],\n \"point\": [ \n { \n \"$\": { \n \"lat\": `${msg.payload.location[0]}`, \n \"lon\": `${msg.payload.location[1]}`, \n \"hae\": \"9999999.0\", \n \"ce\": \"9999999.0\", \n \"le\": \"9999999.0\"\n }\n \n }\n ]\n }\n \n}\nreturn msg;", 1122 | "outputs": 1, 1123 | "noerr": 0, 1124 | "initialize": "", 1125 | "finalize": "", 1126 | "libs": [], 1127 | "x": 1130, 1128 | "y": 840, 1129 | "wires": [ 1130 | [ 1131 | "c9f26484.cc198" 1132 | ] 1133 | ] 1134 | }, 1135 | { 1136 | "id": "c9f26484.cc198", 1137 | "type": "xml", 1138 | "z": "8b54ee4c.ea65c", 1139 | "name": "", 1140 | "property": "payload", 1141 | "attr": "", 1142 | "chr": "", 1143 | "x": 1270, 1144 | "y": 840, 1145 | "wires": [ 1146 | [ 1147 | "d75c3dbe.66403", 1148 | "da5fca12cd52d24d" 1149 | ] 1150 | ] 1151 | }, 1152 | { 1153 | "id": "1ccb5570.39929b", 1154 | "type": "switch", 1155 | "z": "8b54ee4c.ea65c", 1156 | "name": "Sort blank grid", 1157 | "property": "payload.Maidenhead", 1158 | "propertyType": "msg", 1159 | "rules": [ 1160 | { 1161 | "t": "neq", 1162 | "v": "", 1163 | "vt": "str" 1164 | }, 1165 | { 1166 | "t": "eq", 1167 | "v": "", 1168 | "vt": "str" 1169 | } 1170 | ], 1171 | "checkall": "true", 1172 | "repair": false, 1173 | "outputs": 2, 1174 | "x": 540, 1175 | "y": 840, 1176 | "wires": [ 1177 | [ 1178 | "7c2c5a9e.2f192c" 1179 | ], 1180 | [] 1181 | ] 1182 | }, 1183 | { 1184 | "id": "7c2c5a9e.2f192c", 1185 | "type": "change", 1186 | "z": "8b54ee4c.ea65c", 1187 | "name": "Trim leading space", 1188 | "rules": [ 1189 | { 1190 | "t": "change", 1191 | "p": "payload.Maidenhead", 1192 | "pt": "msg", 1193 | "from": " ", 1194 | "fromt": "str", 1195 | "to": "", 1196 | "tot": "str" 1197 | } 1198 | ], 1199 | "action": "", 1200 | "property": "", 1201 | "from": "", 1202 | "to": "", 1203 | "reg": false, 1204 | "x": 730, 1205 | "y": 840, 1206 | "wires": [ 1207 | [ 1208 | "ff468168.b344e" 1209 | ] 1210 | ] 1211 | }, 1212 | { 1213 | "id": "a27e101a.d77fd8", 1214 | "type": "change", 1215 | "z": "8b54ee4c.ea65c", 1216 | "name": "Set JS8call port", 1217 | "rules": [ 1218 | { 1219 | "t": "set", 1220 | "p": "port", 1221 | "pt": "msg", 1222 | "to": "js8calludpport", 1223 | "tot": "flow" 1224 | } 1225 | ], 1226 | "action": "", 1227 | "property": "", 1228 | "from": "", 1229 | "to": "", 1230 | "reg": false, 1231 | "x": 1850, 1232 | "y": 260, 1233 | "wires": [ 1234 | [ 1235 | "d728560d.a8bb78", 1236 | "1a8323b0f31b7c57" 1237 | ] 1238 | ] 1239 | }, 1240 | { 1241 | "id": "c22db45e0e2396f0", 1242 | "type": "udp in", 1243 | "z": "8b54ee4c.ea65c", 1244 | "name": "", 1245 | "iface": "", 1246 | "port": "42069", 1247 | "ipv": "udp4", 1248 | "multicast": "true", 1249 | "group": "224.4.20.69", 1250 | "datatype": "utf8", 1251 | "x": 140, 1252 | "y": 260, 1253 | "wires": [ 1254 | [ 1255 | "31ab88177f59f02b" 1256 | ] 1257 | ] 1258 | }, 1259 | { 1260 | "id": "4ba8c5b6928e2bc7", 1261 | "type": "csv", 1262 | "z": "8b54ee4c.ea65c", 1263 | "name": "", 1264 | "sep": ",", 1265 | "hdrin": "", 1266 | "hdrout": "none", 1267 | "multi": "one", 1268 | "ret": "\\n", 1269 | "temp": "method,callsign,vala,valb,valc,vald", 1270 | "skip": "0", 1271 | "strings": true, 1272 | "include_empty_strings": "", 1273 | "include_null_values": "", 1274 | "x": 330, 1275 | "y": 40, 1276 | "wires": [ 1277 | [ 1278 | "7e3893520c7271f5" 1279 | ] 1280 | ] 1281 | }, 1282 | { 1283 | "id": "7e3893520c7271f5", 1284 | "type": "switch", 1285 | "z": "8b54ee4c.ea65c", 1286 | "name": "", 1287 | "property": "payload.method", 1288 | "propertyType": "msg", 1289 | "rules": [ 1290 | { 1291 | "t": "eq", 1292 | "v": "1", 1293 | "vt": "str" 1294 | }, 1295 | { 1296 | "t": "eq", 1297 | "v": "2", 1298 | "vt": "str" 1299 | }, 1300 | { 1301 | "t": "eq", 1302 | "v": "3", 1303 | "vt": "str" 1304 | } 1305 | ], 1306 | "checkall": "true", 1307 | "repair": false, 1308 | "outputs": 3, 1309 | "x": 450, 1310 | "y": 80, 1311 | "wires": [ 1312 | [ 1313 | "aea55b67a996e318" 1314 | ], 1315 | [], 1316 | [ 1317 | "b14ee3af7d3924a1" 1318 | ] 1319 | ] 1320 | }, 1321 | { 1322 | "id": "4f367543937dc17d", 1323 | "type": "inject", 1324 | "z": "8b54ee4c.ea65c", 1325 | "name": "Test PLI", 1326 | "props": [ 1327 | { 1328 | "p": "payload" 1329 | }, 1330 | { 1331 | "p": "topic", 1332 | "vt": "str" 1333 | } 1334 | ], 1335 | "repeat": "", 1336 | "crontab": "", 1337 | "once": false, 1338 | "onceDelay": 0.1, 1339 | "topic": "", 1340 | "payload": "1,callsign,9001,F-G-U-C,DM08AA50GG", 1341 | "payloadType": "str", 1342 | "x": 120, 1343 | "y": 40, 1344 | "wires": [ 1345 | [ 1346 | "4ba8c5b6928e2bc7" 1347 | ] 1348 | ] 1349 | }, 1350 | { 1351 | "id": "91a7cf7419b1675f", 1352 | "type": "function", 1353 | "z": "8b54ee4c.ea65c", 1354 | "name": "Make PLI message", 1355 | "func": "//txdata =msg.payload.callsign + \",\" + msg.payload.lat + \",\" + msg.payload.lon\n// replaced lat/lon with maidenhead\nconst txdata = \"@BOBTAK 1,\" +msg.payload.callsign+ \",\" +msg.payload.uid+ \",\" +msg.payload.milstd_type+ \",\" +msg.payload.maidenhead\nmsg.payload = {\n type:\"TX.SEND_MESSAGE\",value:txdata\n}\nreturn msg;", 1356 | "outputs": 1, 1357 | "noerr": 0, 1358 | "initialize": "", 1359 | "finalize": "", 1360 | "libs": [], 1361 | "x": 1270, 1362 | "y": 60, 1363 | "wires": [ 1364 | [ 1365 | "f714786d9a30b660" 1366 | ] 1367 | ] 1368 | }, 1369 | { 1370 | "id": "1a8323b0f31b7c57", 1371 | "type": "debug", 1372 | "z": "8b54ee4c.ea65c", 1373 | "name": "", 1374 | "active": false, 1375 | "tosidebar": true, 1376 | "console": false, 1377 | "tostatus": false, 1378 | "complete": "true", 1379 | "targetType": "full", 1380 | "statusVal": "", 1381 | "statusType": "auto", 1382 | "x": 2050, 1383 | "y": 180, 1384 | "wires": [] 1385 | }, 1386 | { 1387 | "id": "f714786d9a30b660", 1388 | "type": "json", 1389 | "z": "8b54ee4c.ea65c", 1390 | "name": "", 1391 | "property": "payload", 1392 | "action": "", 1393 | "pretty": false, 1394 | "x": 1530, 1395 | "y": 320, 1396 | "wires": [ 1397 | [ 1398 | "a27e101a.d77fd8" 1399 | ] 1400 | ] 1401 | }, 1402 | { 1403 | "id": "ce1b80e2.b38d6", 1404 | "type": "udp in", 1405 | "z": "8b54ee4c.ea65c", 1406 | "name": "", 1407 | "iface": "", 1408 | "port": "42068", 1409 | "ipv": "udp4", 1410 | "multicast": "false", 1411 | "group": "", 1412 | "datatype": "utf8", 1413 | "x": 100, 1414 | "y": 200, 1415 | "wires": [ 1416 | [ 1417 | "67ecd27d65370b3a" 1418 | ] 1419 | ] 1420 | }, 1421 | { 1422 | "id": "ead3cd41.5cee1", 1423 | "type": "change", 1424 | "z": "8b54ee4c.ea65c", 1425 | "name": "Topic BOBTAK", 1426 | "rules": [ 1427 | { 1428 | "t": "set", 1429 | "p": "topic", 1430 | "pt": "msg", 1431 | "to": "BOBTAK", 1432 | "tot": "str" 1433 | } 1434 | ], 1435 | "action": "", 1436 | "property": "", 1437 | "from": "", 1438 | "to": "", 1439 | "reg": false, 1440 | "x": 320, 1441 | "y": 1020, 1442 | "wires": [ 1443 | [ 1444 | "82caa97e934cd247" 1445 | ] 1446 | ] 1447 | }, 1448 | { 1449 | "id": "c2e55.f8fc49ab", 1450 | "type": "split", 1451 | "z": "8b54ee4c.ea65c", 1452 | "name": "", 1453 | "splt": ",", 1454 | "spltType": "str", 1455 | "arraySplt": 1, 1456 | "arraySpltType": "len", 1457 | "stream": false, 1458 | "addname": "", 1459 | "x": 570, 1460 | "y": 1020, 1461 | "wires": [ 1462 | [ 1463 | "8ee40f1a.4d717" 1464 | ] 1465 | ] 1466 | }, 1467 | { 1468 | "id": "8ee40f1a.4d717", 1469 | "type": "join", 1470 | "z": "8b54ee4c.ea65c", 1471 | "name": "", 1472 | "mode": "custom", 1473 | "build": "array", 1474 | "property": "payload", 1475 | "propertyType": "msg", 1476 | "key": "topic", 1477 | "joiner": "\\n", 1478 | "joinerType": "str", 1479 | "accumulate": false, 1480 | "timeout": "", 1481 | "count": "", 1482 | "reduceRight": false, 1483 | "reduceExp": "", 1484 | "reduceInit": "", 1485 | "reduceInitType": "", 1486 | "reduceFixup": "", 1487 | "x": 690, 1488 | "y": 1020, 1489 | "wires": [ 1490 | [ 1491 | "8117579.fcd3028" 1492 | ] 1493 | ] 1494 | }, 1495 | { 1496 | "id": "1c6839c7.757bee", 1497 | "type": "split", 1498 | "z": "8b54ee4c.ea65c", 1499 | "g": "f5dc25f9.a5649", 1500 | "name": "", 1501 | "splt": "\\n", 1502 | "spltType": "str", 1503 | "arraySplt": 1, 1504 | "arraySpltType": "len", 1505 | "stream": false, 1506 | "addname": "", 1507 | "x": 1030, 1508 | "y": 1380, 1509 | "wires": [ 1510 | [ 1511 | "b1fcec9e.27957" 1512 | ] 1513 | ] 1514 | }, 1515 | { 1516 | "id": "8117579.fcd3028", 1517 | "type": "switch", 1518 | "z": "8b54ee4c.ea65c", 1519 | "name": "Message Type", 1520 | "property": "payload[0]", 1521 | "propertyType": "msg", 1522 | "rules": [ 1523 | { 1524 | "t": "eq", 1525 | "v": "1", 1526 | "vt": "str" 1527 | }, 1528 | { 1529 | "t": "eq", 1530 | "v": "2", 1531 | "vt": "str" 1532 | }, 1533 | { 1534 | "t": "eq", 1535 | "v": "3", 1536 | "vt": "str" 1537 | }, 1538 | { 1539 | "t": "eq", 1540 | "v": "4", 1541 | "vt": "str" 1542 | } 1543 | ], 1544 | "checkall": "true", 1545 | "repair": false, 1546 | "outputs": 4, 1547 | "x": 840, 1548 | "y": 1020, 1549 | "wires": [ 1550 | [ 1551 | "aa10e03fca25dfa5" 1552 | ], 1553 | [ 1554 | "e7436f4e11e44234" 1555 | ], 1556 | [ 1557 | "1c6839c7.757bee" 1558 | ], 1559 | [ 1560 | "855378e38d24f6e3" 1561 | ] 1562 | ] 1563 | }, 1564 | { 1565 | "id": "6c4d9885.59c0e", 1566 | "type": "join", 1567 | "z": "8b54ee4c.ea65c", 1568 | "g": "f5dc25f9.a5649", 1569 | "name": "", 1570 | "mode": "custom", 1571 | "build": "string", 1572 | "property": "payload", 1573 | "propertyType": "msg", 1574 | "key": "topic", 1575 | "joiner": ",", 1576 | "joinerType": "str", 1577 | "accumulate": false, 1578 | "timeout": "", 1579 | "count": "", 1580 | "reduceRight": false, 1581 | "reduceExp": "", 1582 | "reduceInit": "", 1583 | "reduceInitType": "", 1584 | "reduceFixup": "", 1585 | "x": 1630, 1586 | "y": 1400, 1587 | "wires": [ 1588 | [ 1589 | "728e884ee8f0fbdd" 1590 | ] 1591 | ] 1592 | }, 1593 | { 1594 | "id": "f994ed59.b9063", 1595 | "type": "inject", 1596 | "z": "8b54ee4c.ea65c", 1597 | "name": "tx.get_text", 1598 | "props": [ 1599 | { 1600 | "p": "payload" 1601 | } 1602 | ], 1603 | "repeat": "", 1604 | "crontab": "", 1605 | "once": false, 1606 | "onceDelay": 0.1, 1607 | "topic": "", 1608 | "payload": "{\"type\":\"TX.GET_TEXT\"}", 1609 | "payloadType": "str", 1610 | "x": 1520, 1611 | "y": 40, 1612 | "wires": [ 1613 | [ 1614 | "a27e101a.d77fd8" 1615 | ] 1616 | ] 1617 | }, 1618 | { 1619 | "id": "b1fcec9e.27957", 1620 | "type": "switch", 1621 | "z": "8b54ee4c.ea65c", 1622 | "g": "f5dc25f9.a5649", 1623 | "name": "Split type,callsign,text", 1624 | "property": "msg.parts.count - msg.parts.index", 1625 | "propertyType": "jsonata", 1626 | "rules": [ 1627 | { 1628 | "t": "eq", 1629 | "v": "msg.parts.count", 1630 | "vt": "jsonata" 1631 | }, 1632 | { 1633 | "t": "eq", 1634 | "v": "msg.parts.count - 1", 1635 | "vt": "jsonata" 1636 | }, 1637 | { 1638 | "t": "gt", 1639 | "v": "2", 1640 | "vt": "str" 1641 | }, 1642 | { 1643 | "t": "eq", 1644 | "v": "1", 1645 | "vt": "num" 1646 | } 1647 | ], 1648 | "checkall": "false", 1649 | "repair": false, 1650 | "outputs": 4, 1651 | "x": 1200, 1652 | "y": 1380, 1653 | "wires": [ 1654 | [], 1655 | [ 1656 | "12834b2af9c8aeef" 1657 | ], 1658 | [ 1659 | "803b23a6.0f6758" 1660 | ], 1661 | [ 1662 | "403cfa9e.cfa7bc" 1663 | ] 1664 | ] 1665 | }, 1666 | { 1667 | "id": "403cfa9e.cfa7bc", 1668 | "type": "change", 1669 | "z": "8b54ee4c.ea65c", 1670 | "g": "f5dc25f9.a5649", 1671 | "name": "", 1672 | "rules": [ 1673 | { 1674 | "t": "set", 1675 | "p": "parts.index", 1676 | "pt": "msg", 1677 | "to": "parts.index - 2", 1678 | "tot": "jsonata" 1679 | }, 1680 | { 1681 | "t": "set", 1682 | "p": "complete", 1683 | "pt": "msg", 1684 | "to": "true", 1685 | "tot": "str" 1686 | } 1687 | ], 1688 | "action": "", 1689 | "property": "", 1690 | "from": "", 1691 | "to": "", 1692 | "reg": false, 1693 | "x": 1440, 1694 | "y": 1440, 1695 | "wires": [ 1696 | [ 1697 | "6c4d9885.59c0e" 1698 | ] 1699 | ] 1700 | }, 1701 | { 1702 | "id": "803b23a6.0f6758", 1703 | "type": "change", 1704 | "z": "8b54ee4c.ea65c", 1705 | "g": "f5dc25f9.a5649", 1706 | "name": "", 1707 | "rules": [ 1708 | { 1709 | "t": "set", 1710 | "p": "parts.index", 1711 | "pt": "msg", 1712 | "to": "parts.index - 2", 1713 | "tot": "jsonata" 1714 | } 1715 | ], 1716 | "action": "", 1717 | "property": "", 1718 | "from": "", 1719 | "to": "", 1720 | "reg": false, 1721 | "x": 1450, 1722 | "y": 1400, 1723 | "wires": [ 1724 | [ 1725 | "6c4d9885.59c0e" 1726 | ] 1727 | ] 1728 | }, 1729 | { 1730 | "id": "b50af0dc.c23678", 1731 | "type": "change", 1732 | "z": "8b54ee4c.ea65c", 1733 | "g": "d8f5bb9088f1ce55", 1734 | "name": "", 1735 | "rules": [ 1736 | { 1737 | "t": "move", 1738 | "p": "payload", 1739 | "pt": "msg", 1740 | "to": "payloadArray", 1741 | "tot": "msg" 1742 | }, 1743 | { 1744 | "t": "set", 1745 | "p": "payload.callsign", 1746 | "pt": "msg", 1747 | "to": "payloadArray[1]", 1748 | "tot": "msg" 1749 | }, 1750 | { 1751 | "t": "set", 1752 | "p": "payload.uid", 1753 | "pt": "msg", 1754 | "to": "payloadArray[2]", 1755 | "tot": "msg" 1756 | }, 1757 | { 1758 | "t": "set", 1759 | "p": "payload.milstd_type", 1760 | "pt": "msg", 1761 | "to": "payloadArray[3]", 1762 | "tot": "msg" 1763 | }, 1764 | { 1765 | "t": "set", 1766 | "p": "payload.Maidenhead", 1767 | "pt": "msg", 1768 | "to": "payloadArray[4]", 1769 | "tot": "msg" 1770 | }, 1771 | { 1772 | "t": "delete", 1773 | "p": "payloadArray", 1774 | "pt": "msg" 1775 | }, 1776 | { 1777 | "t": "delete", 1778 | "p": "payload_orig", 1779 | "pt": "msg" 1780 | } 1781 | ], 1782 | "action": "", 1783 | "property": "", 1784 | "from": "", 1785 | "to": "", 1786 | "reg": false, 1787 | "x": 1140, 1788 | "y": 1080, 1789 | "wires": [ 1790 | [ 1791 | "6bff8cc0.53ae24" 1792 | ] 1793 | ] 1794 | }, 1795 | { 1796 | "id": "6bff8cc0.53ae24", 1797 | "type": "function", 1798 | "z": "8b54ee4c.ea65c", 1799 | "g": "d8f5bb9088f1ce55", 1800 | "name": "Maidenhead -> Lat, Lon", 1801 | "func": "/*\nMaidenhead Class taken from: \n https://github.com/mehmetc/Maidenhead\nAuthor: Mehmet Celik\nLicense: MIT\nCopyright: Copyright 2016 Mehmet Celik\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Mehmet Celik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nclass Maidenhead {\n constructor(lat, lon, precision = 5){\n this.lat = lat;\n this.lon = lon;\n this.precision = precision;\n }\n\n static valid(mlocation){\n if (typeof mlocation !== 'string') {\n return false;\n }\n\n if (mlocation.length < 2) {\n return false;\n }\n\n if ((mlocation.length % 2) !== 0) {\n return false;\n }\n\n var length = mlocation.length / 2;\n\n for (var counter=0; counter= 0 && heading <= 360){\n var compassBearings = [\n {\"label\": \"N\", \"start\": 0, \"end\": 11},\n {\"label\": \"NNE\", \"start\": 11, \"end\": 33},\n {\"label\": \"NE\", \"start\": 34, \"end\": 56},\n {\"label\": \"ENE\", \"start\": 57, \"end\": 78},\n {\"label\": \"E\", \"start\": 79, \"end\": 101},\n {\"label\": \"ESE\", \"start\": 102, \"end\": 123},\n {\"label\": \"SE\", \"start\": 124, \"end\": 146},\n {\"label\": \"SSE\", \"start\": 147, \"end\": 168},\n {\"label\": \"S\", \"start\": 169, \"end\": 191},\n {\"label\": \"SSW\", \"start\": 192, \"end\": 213},\n {\"label\": \"SW\", \"start\": 214, \"end\": 236},\n {\"label\": \"WSW\", \"start\": 237, \"end\": 258},\n {\"label\": \"W\", \"start\":\t259, \"end\": 281},\n {\"label\": \"WNW\", \"start\": 282, \"end\": 303},\n {\"label\": \"NW\", \"start\": 304, \"end\": 326},\n {\"label\": \"NNW\", \"start\": 327, \"end\": 348},\n {\"label\": \"N\", \"start\": 349, \"end\": 360}\n ];\n\n var result = compassBearings.find(function (element, index, array) {\n if (heading > element.start && heading < element.end) {\n return true;\n }\n return false;\n });\n\n return result ? result.label : '';\n }\n }\n\n _deg_to_rad(deg) {\n return deg / 180 * Math.PI;\n }\n\n _rad_to_deg(rad) {\n return rad / Math.PI * 180;\n }\n\n _pad_locator(){\n var length = this._locator.length / 2 ;\n\n while (length < 5) {\n if ((length%2) == 1) {\n this._locator += '55';\n }\n else {\n this._locator += 'LL';\n }\n\n length = this._locator.length / 2;\n }\n }\n\n _range_check(target, range, pos) {\n pos = Number(pos);\n if (pos < -range || pos > range){\n throw target + \" must be between -\" + range + \" and +\" + range;\n }\n\n return pos;\n }\n\n _convert_part_to_latlon(counter, divisor) {\n var grid_lon = this._locator.substr(counter*2, 1);\n var grid_lat = this._locator.substr(counter*2+1, 1);\n\n this._lat += this._l2n(grid_lat) * 10.0 / divisor;\n this._lon += this._l2n(grid_lon) * 20.0 / divisor;\n }\n\n _calculate_field(){\n this.__lat = (this.__lat/10) + 0.0000001;\n this.__lon = (this.__lon/20) + 0.0000001;\n this._locator += this._n2l(Math.floor(this.__lon)).toUpperCase() + this._n2l(Math.floor(this.__lat)).toUpperCase();\n this.__precision -= 1;\n }\n\n _calculate_values(){\n for (let counter=0; counter < this.__precision;counter++) {\n if((counter%2) == 0) {\n this._compute_locator(counter, 10);\n } else {\n this._compute_locator(counter, 24);\n }\n }\n }\n\n _compute_locator(counter, divisor){\n this.__lat = (this.__lat - Math.floor(this.__lat)) * divisor;\n this.__lon = (this.__lon - Math.floor(this.__lon)) * divisor;\n\n if ((counter%2) == 0) {\n this._locator += \"\" + Math.floor(this.__lon) + \"\" + Math.floor(this.__lat)\n } else {\n this._locator += this._n2l(Math.floor(this.__lon)) + this._n2l(Math.floor(this.__lat))\n }\n }\n\n _l2n(letter){\n if (letter.match(/[0-9]+/)) {\n return parseInt(letter);\n }else{\n return letter.toLowerCase().charCodeAt(0) - 97;\n }\n\n }\n _n2l(number){\n return String.fromCharCode(97 + number);\n }\n}\n\n// Extract Maidenhead & Callsign from CQ Call:\n//let splitCopy = msg.payload.copy.split(\" \")\n//msg.payload.Maidenhead = splitCopy.pop();\n//msg.payload.callsign = splitCopy.pop();\n\n// Extract Latitute & Longitude from Maidenhead:\nmsg.payload.location = Maidenhead.toLatLon(msg.payload.Maidenhead);\n\nreturn msg;\n", 1802 | "outputs": 1, 1803 | "noerr": 0, 1804 | "initialize": "", 1805 | "finalize": "", 1806 | "libs": [], 1807 | "x": 1350, 1808 | "y": 1080, 1809 | "wires": [ 1810 | [ 1811 | "dede6a21df541b1d" 1812 | ] 1813 | ] 1814 | }, 1815 | { 1816 | "id": "b8f62473379e71df", 1817 | "type": "udp out", 1818 | "z": "8b54ee4c.ea65c", 1819 | "g": "254eac17e94fc317", 1820 | "name": "Multicast SA", 1821 | "addr": "239.2.3.1", 1822 | "iface": "", 1823 | "port": "6969", 1824 | "ipv": "udp4", 1825 | "outport": "", 1826 | "base64": false, 1827 | "multicast": "false", 1828 | "x": 2150, 1829 | "y": 1020, 1830 | "wires": [] 1831 | }, 1832 | { 1833 | "id": "68953fb3e90a1761", 1834 | "type": "udp out", 1835 | "z": "8b54ee4c.ea65c", 1836 | "g": "254eac17e94fc317", 1837 | "name": "Multicast Chat", 1838 | "addr": "224.10.10.1", 1839 | "iface": "", 1840 | "port": "17012", 1841 | "ipv": "udp4", 1842 | "outport": "", 1843 | "base64": false, 1844 | "multicast": "false", 1845 | "x": 2160, 1846 | "y": 1060, 1847 | "wires": [] 1848 | }, 1849 | { 1850 | "id": "520d7c534c5146c8", 1851 | "type": "link in", 1852 | "z": "8b54ee4c.ea65c", 1853 | "g": "254eac17e94fc317", 1854 | "name": "Send Multicast SA", 1855 | "links": [ 1856 | "b06c793abd4cb6c5", 1857 | "da5fca12cd52d24d", 1858 | "ede570fd6fec4f3c", 1859 | "9a8fef750361e618" 1860 | ], 1861 | "x": 2035, 1862 | "y": 1020, 1863 | "wires": [ 1864 | [ 1865 | "b8f62473379e71df" 1866 | ] 1867 | ] 1868 | }, 1869 | { 1870 | "id": "ce2290e97c4b972a", 1871 | "type": "link in", 1872 | "z": "8b54ee4c.ea65c", 1873 | "g": "254eac17e94fc317", 1874 | "name": "Send Multicast Chat", 1875 | "links": [ 1876 | "1f118938943677a0" 1877 | ], 1878 | "x": 2035, 1879 | "y": 1060, 1880 | "wires": [ 1881 | [ 1882 | "68953fb3e90a1761" 1883 | ] 1884 | ] 1885 | }, 1886 | { 1887 | "id": "1f118938943677a0", 1888 | "type": "link out", 1889 | "z": "8b54ee4c.ea65c", 1890 | "g": "f5dc25f9.a5649", 1891 | "name": "Multicast Geochat", 1892 | "mode": "link", 1893 | "links": [ 1894 | "ce2290e97c4b972a" 1895 | ], 1896 | "x": 2395, 1897 | "y": 1480, 1898 | "wires": [] 1899 | }, 1900 | { 1901 | "id": "b06c793abd4cb6c5", 1902 | "type": "link out", 1903 | "z": "8b54ee4c.ea65c", 1904 | "g": "d8f5bb9088f1ce55", 1905 | "name": "Position SA", 1906 | "mode": "link", 1907 | "links": [ 1908 | "520d7c534c5146c8" 1909 | ], 1910 | "x": 1775, 1911 | "y": 1080, 1912 | "wires": [] 1913 | }, 1914 | { 1915 | "id": "dede6a21df541b1d", 1916 | "type": "function", 1917 | "z": "8b54ee4c.ea65c", 1918 | "g": "d8f5bb9088f1ce55", 1919 | "name": "CoT", 1920 | "func": "const dt = Date.now();\nconst dtD = new Date(dt);\nconst dtD5 = new Date(dt + 14400000);\n\nmsg.payload = {\n \"event\": {\n \"$\": { \n \"version\":\"2.0\",\n \"type\":\"a-\"+`${msg.payload.milstd_type}`,\n \"uid\":`${msg.payload.uid}`,\n \"time\":dtD.toISOString(),\n \"start\":dtD.toISOString(),\n \"stale\":dtD5.toISOString(),\n \"how\":\"h-g-i-g-o\"\n\n },\n \"detail\": [\n {\n \"contact\": [\n {\n \"$\": {\n \"callsign\":`${msg.payload.callsign}`\n }\n }],\n \"ce_human_input\":\"true\",\n \"remarks\":\"\",\n \"link\": [\n {\n \"$\": {\n \"uid\":\"80085\",\n \"production_time\":dtD.toISOString(),\n \"type\":\"a-f-G-U-U-S-R\",\n \"parent_callsign\":\"BOBTAK\",\n \"relation\":\"p-p\"\n }\n }],\n \"precisionlocation\": [\n {\n \"$\": {\n \"geopointsrc\":\"USER\"\n }\n }]\n }],\n \"point\": [ \n { \n \"$\": { \n \"lat\": `${msg.payload.location[0]}`, \n \"lon\": `${msg.payload.location[1]}`, \n \"hae\": \"9999999.0\", \n \"ce\": \"35.0\", \n \"le\": \"9999999.0\"\n }\n \n }\n ]\n }\n \n}\nreturn msg;", 1921 | "outputs": 1, 1922 | "noerr": 0, 1923 | "initialize": "", 1924 | "finalize": "", 1925 | "libs": [], 1926 | "x": 1530, 1927 | "y": 1080, 1928 | "wires": [ 1929 | [ 1930 | "abf171300f0f917b" 1931 | ] 1932 | ] 1933 | }, 1934 | { 1935 | "id": "abf171300f0f917b", 1936 | "type": "xml", 1937 | "z": "8b54ee4c.ea65c", 1938 | "g": "d8f5bb9088f1ce55", 1939 | "name": "", 1940 | "property": "payload", 1941 | "attr": "", 1942 | "chr": "", 1943 | "x": 1670, 1944 | "y": 1080, 1945 | "wires": [ 1946 | [ 1947 | "b06c793abd4cb6c5" 1948 | ] 1949 | ] 1950 | }, 1951 | { 1952 | "id": "aa10e03fca25dfa5", 1953 | "type": "split", 1954 | "z": "8b54ee4c.ea65c", 1955 | "g": "4293e1e285423ebc", 1956 | "name": "", 1957 | "splt": "\\n", 1958 | "spltType": "str", 1959 | "arraySplt": 1, 1960 | "arraySpltType": "len", 1961 | "stream": false, 1962 | "addname": "", 1963 | "x": 1050, 1964 | "y": 1000, 1965 | "wires": [ 1966 | [ 1967 | "1b8a82de050726b5" 1968 | ] 1969 | ] 1970 | }, 1971 | { 1972 | "id": "1b8a82de050726b5", 1973 | "type": "switch", 1974 | "z": "8b54ee4c.ea65c", 1975 | "g": "4293e1e285423ebc", 1976 | "name": "", 1977 | "property": "parts.index", 1978 | "propertyType": "msg", 1979 | "rules": [ 1980 | { 1981 | "t": "eq", 1982 | "v": "3", 1983 | "vt": "num" 1984 | }, 1985 | { 1986 | "t": "neq", 1987 | "v": "3", 1988 | "vt": "num" 1989 | } 1990 | ], 1991 | "checkall": "true", 1992 | "repair": false, 1993 | "outputs": 2, 1994 | "x": 1170, 1995 | "y": 1000, 1996 | "wires": [ 1997 | [ 1998 | "b62bd9ddec8c5ed5" 1999 | ], 2000 | [ 2001 | "b6837bc29c229ca2" 2002 | ] 2003 | ] 2004 | }, 2005 | { 2006 | "id": "b62bd9ddec8c5ed5", 2007 | "type": "split", 2008 | "z": "8b54ee4c.ea65c", 2009 | "g": "4293e1e285423ebc", 2010 | "name": "", 2011 | "splt": "-", 2012 | "spltType": "str", 2013 | "arraySplt": 1, 2014 | "arraySpltType": "len", 2015 | "stream": false, 2016 | "addname": "", 2017 | "x": 1290, 2018 | "y": 980, 2019 | "wires": [ 2020 | [ 2021 | "563cedc7709d7e67" 2022 | ] 2023 | ] 2024 | }, 2025 | { 2026 | "id": "563cedc7709d7e67", 2027 | "type": "switch", 2028 | "z": "8b54ee4c.ea65c", 2029 | "g": "4293e1e285423ebc", 2030 | "name": "", 2031 | "property": "parts.index", 2032 | "propertyType": "msg", 2033 | "rules": [ 2034 | { 2035 | "t": "eq", 2036 | "v": "0", 2037 | "vt": "str" 2038 | }, 2039 | { 2040 | "t": "neq", 2041 | "v": "0", 2042 | "vt": "str" 2043 | } 2044 | ], 2045 | "checkall": "true", 2046 | "repair": false, 2047 | "outputs": 2, 2048 | "x": 1410, 2049 | "y": 980, 2050 | "wires": [ 2051 | [ 2052 | "5226d5209bd8e64a" 2053 | ], 2054 | [ 2055 | "15020e8ad2052312" 2056 | ] 2057 | ] 2058 | }, 2059 | { 2060 | "id": "5226d5209bd8e64a", 2061 | "type": "change", 2062 | "z": "8b54ee4c.ea65c", 2063 | "g": "4293e1e285423ebc", 2064 | "name": "", 2065 | "rules": [ 2066 | { 2067 | "t": "set", 2068 | "p": "payload", 2069 | "pt": "msg", 2070 | "to": "$lowercase(payload)\t", 2071 | "tot": "jsonata" 2072 | } 2073 | ], 2074 | "action": "", 2075 | "property": "", 2076 | "from": "", 2077 | "to": "", 2078 | "reg": false, 2079 | "x": 1560, 2080 | "y": 960, 2081 | "wires": [ 2082 | [ 2083 | "15020e8ad2052312" 2084 | ] 2085 | ] 2086 | }, 2087 | { 2088 | "id": "15020e8ad2052312", 2089 | "type": "join", 2090 | "z": "8b54ee4c.ea65c", 2091 | "g": "4293e1e285423ebc", 2092 | "name": "", 2093 | "mode": "auto", 2094 | "build": "string", 2095 | "property": "payload", 2096 | "propertyType": "msg", 2097 | "key": "topic", 2098 | "joiner": "-", 2099 | "joinerType": "str", 2100 | "accumulate": false, 2101 | "timeout": "", 2102 | "count": "", 2103 | "reduceRight": false, 2104 | "reduceExp": "", 2105 | "reduceInit": "", 2106 | "reduceInitType": "", 2107 | "reduceFixup": "", 2108 | "x": 1710, 2109 | "y": 980, 2110 | "wires": [ 2111 | [ 2112 | "b6837bc29c229ca2" 2113 | ] 2114 | ] 2115 | }, 2116 | { 2117 | "id": "b6837bc29c229ca2", 2118 | "type": "join", 2119 | "z": "8b54ee4c.ea65c", 2120 | "g": "4293e1e285423ebc", 2121 | "name": "", 2122 | "mode": "auto", 2123 | "build": "object", 2124 | "property": "payload", 2125 | "propertyType": "msg", 2126 | "key": "topic", 2127 | "joiner": "\\n", 2128 | "joinerType": "str", 2129 | "accumulate": "false", 2130 | "timeout": "", 2131 | "count": "", 2132 | "reduceRight": false, 2133 | "x": 1830, 2134 | "y": 1000, 2135 | "wires": [ 2136 | [ 2137 | "b50af0dc.c23678" 2138 | ] 2139 | ] 2140 | }, 2141 | { 2142 | "id": "0298b40d237dc9a4", 2143 | "type": "comment", 2144 | "z": "8b54ee4c.ea65c", 2145 | "g": "d8f5bb9088f1ce55", 2146 | "name": "Format", 2147 | "info": "1,callsign,uid,2525B_type,maidenhead", 2148 | "x": 1310, 2149 | "y": 920, 2150 | "wires": [] 2151 | }, 2152 | { 2153 | "id": "678989a8ec1cd08b", 2154 | "type": "udp in", 2155 | "z": "8b54ee4c.ea65c", 2156 | "name": "Capture Chat", 2157 | "iface": "", 2158 | "port": "17012", 2159 | "ipv": "udp4", 2160 | "multicast": "true", 2161 | "group": "224.10.10.1", 2162 | "datatype": "utf8", 2163 | "x": 2090, 2164 | "y": 900, 2165 | "wires": [ 2166 | [] 2167 | ] 2168 | }, 2169 | { 2170 | "id": "3dd3083e1eb7121c", 2171 | "type": "change", 2172 | "z": "8b54ee4c.ea65c", 2173 | "g": "f5dc25f9.a5649", 2174 | "name": "Random UID", 2175 | "rules": [ 2176 | { 2177 | "t": "set", 2178 | "p": "chatuid", 2179 | "pt": "msg", 2180 | "to": "$random() * 100000000000000000\t", 2181 | "tot": "jsonata" 2182 | } 2183 | ], 2184 | "action": "", 2185 | "property": "", 2186 | "from": "", 2187 | "to": "", 2188 | "reg": false, 2189 | "x": 1990, 2190 | "y": 1420, 2191 | "wires": [ 2192 | [ 2193 | "f45ca8af34c2c8d5" 2194 | ] 2195 | ] 2196 | }, 2197 | { 2198 | "id": "3dd3b19243ce47d9", 2199 | "type": "comment", 2200 | "z": "8b54ee4c.ea65c", 2201 | "g": "f5dc25f9.a5649", 2202 | "name": "Format", 2203 | "info": "3,callsign,chat_text", 2204 | "x": 1410, 2205 | "y": 1320, 2206 | "wires": [] 2207 | }, 2208 | { 2209 | "id": "12834b2af9c8aeef", 2210 | "type": "change", 2211 | "z": "8b54ee4c.ea65c", 2212 | "g": "f5dc25f9.a5649", 2213 | "name": "Apply callsign", 2214 | "rules": [ 2215 | { 2216 | "t": "set", 2217 | "p": "parts.count", 2218 | "pt": "msg", 2219 | "to": "2", 2220 | "tot": "num" 2221 | }, 2222 | { 2223 | "t": "set", 2224 | "p": "parts.len", 2225 | "pt": "msg", 2226 | "to": "1", 2227 | "tot": "num" 2228 | }, 2229 | { 2230 | "t": "set", 2231 | "p": "parts.index", 2232 | "pt": "msg", 2233 | "to": "1", 2234 | "tot": "num" 2235 | }, 2236 | { 2237 | "t": "set", 2238 | "p": "parts.id", 2239 | "pt": "msg", 2240 | "to": "9001", 2241 | "tot": "str" 2242 | } 2243 | ], 2244 | "action": "", 2245 | "property": "", 2246 | "from": "", 2247 | "to": "", 2248 | "reg": false, 2249 | "x": 1440, 2250 | "y": 1360, 2251 | "wires": [ 2252 | [ 2253 | "ce134ad32cfaa1b6" 2254 | ] 2255 | ] 2256 | }, 2257 | { 2258 | "id": "728e884ee8f0fbdd", 2259 | "type": "change", 2260 | "z": "8b54ee4c.ea65c", 2261 | "g": "f5dc25f9.a5649", 2262 | "name": "Apply msg text", 2263 | "rules": [ 2264 | { 2265 | "t": "set", 2266 | "p": "parts.count", 2267 | "pt": "msg", 2268 | "to": "2", 2269 | "tot": "num" 2270 | }, 2271 | { 2272 | "t": "set", 2273 | "p": "parts.len", 2274 | "pt": "msg", 2275 | "to": "1", 2276 | "tot": "num" 2277 | }, 2278 | { 2279 | "t": "set", 2280 | "p": "parts.index", 2281 | "pt": "msg", 2282 | "to": "0", 2283 | "tot": "num" 2284 | }, 2285 | { 2286 | "t": "set", 2287 | "p": "parts.id", 2288 | "pt": "msg", 2289 | "to": "9001", 2290 | "tot": "str" 2291 | }, 2292 | { 2293 | "t": "set", 2294 | "p": "parts.type", 2295 | "pt": "msg", 2296 | "to": "array", 2297 | "tot": "str" 2298 | } 2299 | ], 2300 | "action": "", 2301 | "property": "", 2302 | "from": "", 2303 | "to": "", 2304 | "reg": false, 2305 | "x": 1780, 2306 | "y": 1400, 2307 | "wires": [ 2308 | [ 2309 | "ce134ad32cfaa1b6" 2310 | ] 2311 | ] 2312 | }, 2313 | { 2314 | "id": "ce134ad32cfaa1b6", 2315 | "type": "join", 2316 | "z": "8b54ee4c.ea65c", 2317 | "g": "f5dc25f9.a5649", 2318 | "name": "", 2319 | "mode": "custom", 2320 | "build": "array", 2321 | "property": "payload", 2322 | "propertyType": "msg", 2323 | "key": "topic", 2324 | "joiner": "\\n", 2325 | "joinerType": "str", 2326 | "accumulate": false, 2327 | "timeout": "1", 2328 | "count": "2", 2329 | "reduceRight": false, 2330 | "reduceExp": "", 2331 | "reduceInit": "", 2332 | "reduceInitType": "", 2333 | "reduceFixup": "", 2334 | "x": 1950, 2335 | "y": 1360, 2336 | "wires": [ 2337 | [ 2338 | "3dd3083e1eb7121c" 2339 | ] 2340 | ] 2341 | }, 2342 | { 2343 | "id": "f45ca8af34c2c8d5", 2344 | "type": "function", 2345 | "z": "8b54ee4c.ea65c", 2346 | "g": "f5dc25f9.a5649", 2347 | "name": "Geochat CoT", 2348 | "func": "const dt = Date.now();\nconst dtD = new Date(dt);\nconst dtD5 = new Date(dt + 14400000);\n\nmsg.payload = {\n \"event\":{\n \"$\":{\n \"version\":\"2.0\",\n \"uid\":`${msg.chatuid}`,\n \"type\":\"b-t-f\",\n \"time\":dtD.toISOString(),\n \"start\":dtD.toISOString(),\n \"stale\":dtD5.toISOString(),\n \"how\":\"h-g-i-g-o\"},\n \"point\":[{\n \"$\":{\n \"lat\":\"-0.004287826538927404\",\n \"lon\":\"-0.0076812372022802555\",\n \"hae\":\"9999999.0\",\n \"ce\":\"9999999.0\",\n \"le\":\"9999999.0\"\n }\n \n }],\n \"detail\":[{\n \"__chat\":[{\n \"$\":{\n \"senderCallsign\":\"BobTAK\",\n \"chatroom\":\"All Chat Rooms\",\n \"groupOwner\":\"false\",\n \"id\":\"All Chat Rooms\",\n \"parent\":\"RootContactGroup\"\n \n },\n \"chatgrp\":[{\n \"$\":{\n \"uid0\":\"BobTAK-uid\",\n \"uid1\":\"All Chat Rooms\",\n \"id\":\"All Chat Rooms\"\n \n }\n \n }]\n \n }],\n \"link\":[{\n \"$\":{\n \"relation\":\"p-p\",\n \"type\":\"a-f-G-U-C\",\n \"uid\":\"BobTAK-uid\"\n \n }\n \n }],\n \"remarks\":[{\n \"_\":`${msg.payload[0]}` + \": \" + `${msg.payload[1]}`,\n \"$\":{\n \"time\":dtD.toISOString(),\n \"to\":\"All Chat Rooms\",\n \"source\":\"BAO.F.ATAK.BobTAK-uid\"\n \n }\n \n }],\n \"__serverdestination\":[{\n \"$\":{\n \"destinations\":\"224.10.10.2:17012:udp:BobTAK-uid\"\n \n }\n \n }]\n \n }]\n \n }\n \n}\nreturn msg;", 2349 | "outputs": 1, 2350 | "noerr": 0, 2351 | "initialize": "", 2352 | "finalize": "", 2353 | "libs": [], 2354 | "x": 1990, 2355 | "y": 1460, 2356 | "wires": [ 2357 | [ 2358 | "7fce549521b78999", 2359 | "e6a87d2348ce4cc1" 2360 | ] 2361 | ] 2362 | }, 2363 | { 2364 | "id": "e779a5deb9dbe464", 2365 | "type": "xml", 2366 | "z": "8b54ee4c.ea65c", 2367 | "g": "f5dc25f9.a5649", 2368 | "name": "", 2369 | "property": "payload", 2370 | "attr": "", 2371 | "chr": "", 2372 | "x": 2310, 2373 | "y": 1460, 2374 | "wires": [ 2375 | [ 2376 | "1f118938943677a0" 2377 | ] 2378 | ] 2379 | }, 2380 | { 2381 | "id": "e6a87d2348ce4cc1", 2382 | "type": "delay", 2383 | "z": "8b54ee4c.ea65c", 2384 | "g": "f5dc25f9.a5649", 2385 | "name": "", 2386 | "pauseType": "delay", 2387 | "timeout": "1", 2388 | "timeoutUnits": "seconds", 2389 | "rate": "1", 2390 | "nbRateUnits": "1", 2391 | "rateUnits": "second", 2392 | "randomFirst": "1", 2393 | "randomLast": "5", 2394 | "randomUnits": "seconds", 2395 | "drop": false, 2396 | "allowrate": false, 2397 | "outputs": 1, 2398 | "x": 2180, 2399 | "y": 1460, 2400 | "wires": [ 2401 | [ 2402 | "e779a5deb9dbe464" 2403 | ] 2404 | ] 2405 | }, 2406 | { 2407 | "id": "7fce549521b78999", 2408 | "type": "trigger", 2409 | "z": "8b54ee4c.ea65c", 2410 | "g": "f5dc25f9.a5649", 2411 | "name": "BobTAK Announce", 2412 | "op1": "<__chat senderCallsign='BobTAK' chatroom='All Chat Rooms' groupOwner='false' id='All Chat Rooms' parent='RootContactGroup'> <__serverdestination destinations='224.10.10.2:17012:udp:BobTAK-uid'/>", 2413 | "op2": "", 2414 | "op1type": "str", 2415 | "op2type": "str", 2416 | "duration": "250", 2417 | "extend": false, 2418 | "overrideDelay": false, 2419 | "units": "ms", 2420 | "reset": "", 2421 | "bytopic": "all", 2422 | "topic": "topic", 2423 | "outputs": 2, 2424 | "x": 2010, 2425 | "y": 1500, 2426 | "wires": [ 2427 | [ 2428 | "1f118938943677a0" 2429 | ], 2430 | [] 2431 | ] 2432 | }, 2433 | { 2434 | "id": "da5fca12cd52d24d", 2435 | "type": "link out", 2436 | "z": "8b54ee4c.ea65c", 2437 | "name": "JS8call HB Spot", 2438 | "mode": "link", 2439 | "links": [ 2440 | "520d7c534c5146c8" 2441 | ], 2442 | "x": 1415, 2443 | "y": 840, 2444 | "wires": [] 2445 | }, 2446 | { 2447 | "id": "aea55b67a996e318", 2448 | "type": "change", 2449 | "z": "8b54ee4c.ea65c", 2450 | "name": "Rename values", 2451 | "rules": [ 2452 | { 2453 | "t": "set", 2454 | "p": "payload.uid", 2455 | "pt": "msg", 2456 | "to": "payload.vala", 2457 | "tot": "msg" 2458 | }, 2459 | { 2460 | "t": "move", 2461 | "p": "payload.valc", 2462 | "pt": "msg", 2463 | "to": "payload.maidenhead", 2464 | "tot": "msg" 2465 | }, 2466 | { 2467 | "t": "set", 2468 | "p": "payload.milstd_type", 2469 | "pt": "msg", 2470 | "to": "payload.valb", 2471 | "tot": "msg" 2472 | } 2473 | ], 2474 | "action": "", 2475 | "property": "", 2476 | "from": "", 2477 | "to": "", 2478 | "reg": false, 2479 | "x": 640, 2480 | "y": 60, 2481 | "wires": [ 2482 | [ 2483 | "91a7cf7419b1675f" 2484 | ] 2485 | ] 2486 | }, 2487 | { 2488 | "id": "42b657d9ab690799", 2489 | "type": "inject", 2490 | "z": "8b54ee4c.ea65c", 2491 | "name": "Test Geochat", 2492 | "props": [ 2493 | { 2494 | "p": "payload" 2495 | }, 2496 | { 2497 | "p": "topic", 2498 | "vt": "str" 2499 | } 2500 | ], 2501 | "repeat": "", 2502 | "crontab": "", 2503 | "once": false, 2504 | "onceDelay": 0.1, 2505 | "topic": "", 2506 | "payload": "3,callsign,geochat message", 2507 | "payloadType": "str", 2508 | "x": 130, 2509 | "y": 80, 2510 | "wires": [ 2511 | [ 2512 | "4ba8c5b6928e2bc7" 2513 | ] 2514 | ] 2515 | }, 2516 | { 2517 | "id": "7d7a9a497dad54f2", 2518 | "type": "udp in", 2519 | "z": "8b54ee4c.ea65c", 2520 | "name": "Capture PLI", 2521 | "iface": "", 2522 | "port": "6969", 2523 | "ipv": "udp4", 2524 | "multicast": "true", 2525 | "group": "239.2.3.1", 2526 | "datatype": "utf8", 2527 | "x": 2090, 2528 | "y": 860, 2529 | "wires": [ 2530 | [] 2531 | ] 2532 | }, 2533 | { 2534 | "id": "be332f3baeb7b7f6", 2535 | "type": "function", 2536 | "z": "8b54ee4c.ea65c", 2537 | "name": "Make geochat message", 2538 | "func": "const txdata = \"3,\" + msg.payload.callsign+\",\"+msg.payload.msg\n\nmsg.payload = {\n type:\"TX.SEND_MESSAGE\",value:\"@BOBTAK \"+txdata\n}\nreturn msg;", 2539 | "outputs": 1, 2540 | "noerr": 0, 2541 | "initialize": "", 2542 | "finalize": "", 2543 | "libs": [], 2544 | "x": 870, 2545 | "y": 100, 2546 | "wires": [ 2547 | [ 2548 | "f714786d9a30b660" 2549 | ] 2550 | ] 2551 | }, 2552 | { 2553 | "id": "b14ee3af7d3924a1", 2554 | "type": "change", 2555 | "z": "8b54ee4c.ea65c", 2556 | "name": "Rename values", 2557 | "rules": [ 2558 | { 2559 | "t": "move", 2560 | "p": "payload.vala", 2561 | "pt": "msg", 2562 | "to": "payload.msg", 2563 | "tot": "msg" 2564 | } 2565 | ], 2566 | "action": "", 2567 | "property": "", 2568 | "from": "", 2569 | "to": "", 2570 | "reg": false, 2571 | "x": 640, 2572 | "y": 100, 2573 | "wires": [ 2574 | [ 2575 | "be332f3baeb7b7f6" 2576 | ] 2577 | ] 2578 | }, 2579 | { 2580 | "id": "c718df7ee7a9ffeb", 2581 | "type": "switch", 2582 | "z": "8b54ee4c.ea65c", 2583 | "name": "Split if PING", 2584 | "property": "payload.type", 2585 | "propertyType": "msg", 2586 | "rules": [ 2587 | { 2588 | "t": "neq", 2589 | "v": "PING", 2590 | "vt": "str" 2591 | }, 2592 | { 2593 | "t": "eq", 2594 | "v": "PING", 2595 | "vt": "str" 2596 | } 2597 | ], 2598 | "checkall": "true", 2599 | "repair": false, 2600 | "outputs": 2, 2601 | "x": 630, 2602 | "y": 360, 2603 | "wires": [ 2604 | [ 2605 | "912da804.97fd" 2606 | ], 2607 | [] 2608 | ] 2609 | }, 2610 | { 2611 | "id": "9c778c79dabd638a", 2612 | "type": "change", 2613 | "z": "8b54ee4c.ea65c", 2614 | "name": "", 2615 | "rules": [ 2616 | { 2617 | "t": "set", 2618 | "p": "payload.Maidenhead", 2619 | "pt": "msg", 2620 | "to": "payload.params.GRID", 2621 | "tot": "msg" 2622 | }, 2623 | { 2624 | "t": "set", 2625 | "p": "payload.callsign", 2626 | "pt": "msg", 2627 | "to": "payload.params.FROM", 2628 | "tot": "msg" 2629 | } 2630 | ], 2631 | "action": "", 2632 | "property": "", 2633 | "from": "", 2634 | "to": "", 2635 | "reg": false, 2636 | "x": 160, 2637 | "y": 840, 2638 | "wires": [ 2639 | [ 2640 | "d1fa4945.716b4", 2641 | "57a45ea62ac15ab6" 2642 | ] 2643 | ] 2644 | }, 2645 | { 2646 | "id": "57a45ea62ac15ab6", 2647 | "type": "switch", 2648 | "z": "8b54ee4c.ea65c", 2649 | "name": "JS8call Group", 2650 | "property": "payload.params.TO", 2651 | "propertyType": "msg", 2652 | "rules": [ 2653 | { 2654 | "t": "eq", 2655 | "v": "@BOBTAK", 2656 | "vt": "str" 2657 | } 2658 | ], 2659 | "checkall": "true", 2660 | "repair": false, 2661 | "outputs": 1, 2662 | "x": 180, 2663 | "y": 900, 2664 | "wires": [ 2665 | [ 2666 | "ead3cd41.5cee1" 2667 | ] 2668 | ] 2669 | }, 2670 | { 2671 | "id": "80ef503301041999", 2672 | "type": "split", 2673 | "z": "8b54ee4c.ea65c", 2674 | "g": "6b96f7fd166dd3d7", 2675 | "name": "", 2676 | "splt": " ", 2677 | "spltType": "str", 2678 | "arraySplt": 1, 2679 | "arraySpltType": "len", 2680 | "stream": false, 2681 | "addname": "", 2682 | "x": 330, 2683 | "y": 1680, 2684 | "wires": [ 2685 | [ 2686 | "c28984d8e24352c0" 2687 | ] 2688 | ] 2689 | }, 2690 | { 2691 | "id": "c28984d8e24352c0", 2692 | "type": "switch", 2693 | "z": "8b54ee4c.ea65c", 2694 | "g": "6b96f7fd166dd3d7", 2695 | "name": "Split away callsigns", 2696 | "property": "parts.index", 2697 | "propertyType": "msg", 2698 | "rules": [ 2699 | { 2700 | "t": "lt", 2701 | "v": "2", 2702 | "vt": "str" 2703 | }, 2704 | { 2705 | "t": "gt", 2706 | "v": "2", 2707 | "vt": "str" 2708 | } 2709 | ], 2710 | "checkall": "true", 2711 | "repair": false, 2712 | "outputs": 2, 2713 | "x": 490, 2714 | "y": 1680, 2715 | "wires": [ 2716 | [], 2717 | [ 2718 | "4099e26f3839f67e" 2719 | ] 2720 | ] 2721 | }, 2722 | { 2723 | "id": "93088c0f80eebb1e", 2724 | "type": "change", 2725 | "z": "8b54ee4c.ea65c", 2726 | "g": "6b96f7fd166dd3d7", 2727 | "name": "Renumber index", 2728 | "rules": [ 2729 | { 2730 | "t": "set", 2731 | "p": "parts.index", 2732 | "pt": "msg", 2733 | "to": "msg.parts.index - 3", 2734 | "tot": "jsonata" 2735 | }, 2736 | { 2737 | "t": "set", 2738 | "p": "parts.count", 2739 | "pt": "msg", 2740 | "to": "msg.parts.count -5", 2741 | "tot": "jsonata" 2742 | } 2743 | ], 2744 | "action": "", 2745 | "property": "", 2746 | "from": "", 2747 | "to": "", 2748 | "reg": false, 2749 | "x": 860, 2750 | "y": 1680, 2751 | "wires": [ 2752 | [ 2753 | "bb3d0b05206f172b" 2754 | ] 2755 | ] 2756 | }, 2757 | { 2758 | "id": "bb3d0b05206f172b", 2759 | "type": "join", 2760 | "z": "8b54ee4c.ea65c", 2761 | "g": "6b96f7fd166dd3d7", 2762 | "name": "", 2763 | "mode": "auto", 2764 | "build": "object", 2765 | "property": "payload", 2766 | "propertyType": "msg", 2767 | "key": "topic", 2768 | "joiner": "\\n", 2769 | "joinerType": "str", 2770 | "accumulate": "false", 2771 | "timeout": "", 2772 | "count": "", 2773 | "reduceRight": false, 2774 | "x": 1010, 2775 | "y": 1680, 2776 | "wires": [ 2777 | [ 2778 | "c2e55.f8fc49ab" 2779 | ] 2780 | ] 2781 | }, 2782 | { 2783 | "id": "4099e26f3839f67e", 2784 | "type": "switch", 2785 | "z": "8b54ee4c.ea65c", 2786 | "g": "6b96f7fd166dd3d7", 2787 | "name": "Split off arrow", 2788 | "property": "parts.index", 2789 | "propertyType": "msg", 2790 | "rules": [ 2791 | { 2792 | "t": "lt", 2793 | "v": "msg.parts.count - 2", 2794 | "vt": "jsonata" 2795 | }, 2796 | { 2797 | "t": "gte", 2798 | "v": "msg.parts.count - 2", 2799 | "vt": "str" 2800 | } 2801 | ], 2802 | "checkall": "true", 2803 | "repair": false, 2804 | "outputs": 2, 2805 | "x": 680, 2806 | "y": 1720, 2807 | "wires": [ 2808 | [ 2809 | "93088c0f80eebb1e" 2810 | ], 2811 | [] 2812 | ] 2813 | }, 2814 | { 2815 | "id": "fb9552cb39033b58", 2816 | "type": "inject", 2817 | "z": "8b54ee4c.ea65c", 2818 | "name": "", 2819 | "props": [ 2820 | { 2821 | "p": "payload" 2822 | }, 2823 | { 2824 | "p": "topic", 2825 | "vt": "str" 2826 | } 2827 | ], 2828 | "repeat": "60", 2829 | "crontab": "", 2830 | "once": true, 2831 | "onceDelay": "0.5", 2832 | "topic": "", 2833 | "payloadType": "date", 2834 | "x": 1790, 2835 | "y": 40, 2836 | "wires": [ 2837 | [ 2838 | "d439cf1a69d11156" 2839 | ] 2840 | ] 2841 | }, 2842 | { 2843 | "id": "d439cf1a69d11156", 2844 | "type": "change", 2845 | "z": "8b54ee4c.ea65c", 2846 | "name": "", 2847 | "rules": [ 2848 | { 2849 | "t": "set", 2850 | "p": "mycallsign", 2851 | "pt": "global", 2852 | "to": "HFRadio1", 2853 | "tot": "str" 2854 | } 2855 | ], 2856 | "action": "", 2857 | "property": "", 2858 | "from": "", 2859 | "to": "", 2860 | "reg": false, 2861 | "x": 1990, 2862 | "y": 40, 2863 | "wires": [ 2864 | [] 2865 | ] 2866 | }, 2867 | { 2868 | "id": "d1d20e3c1c32b38e", 2869 | "type": "debug", 2870 | "z": "8b54ee4c.ea65c", 2871 | "name": "", 2872 | "active": false, 2873 | "tosidebar": true, 2874 | "console": false, 2875 | "tostatus": false, 2876 | "complete": "true", 2877 | "targetType": "full", 2878 | "statusVal": "", 2879 | "statusType": "auto", 2880 | "x": 3010, 2881 | "y": 400, 2882 | "wires": [] 2883 | }, 2884 | { 2885 | "id": "f9eae50c7b799d58", 2886 | "type": "debug", 2887 | "z": "8b54ee4c.ea65c", 2888 | "name": "", 2889 | "active": false, 2890 | "tosidebar": true, 2891 | "console": false, 2892 | "tostatus": false, 2893 | "complete": "true", 2894 | "targetType": "full", 2895 | "statusVal": "", 2896 | "statusType": "auto", 2897 | "x": 910, 2898 | "y": 280, 2899 | "wires": [] 2900 | }, 2901 | { 2902 | "id": "31ab88177f59f02b", 2903 | "type": "xml", 2904 | "z": "8b54ee4c.ea65c", 2905 | "name": "", 2906 | "property": "payload", 2907 | "attr": "", 2908 | "chr": "", 2909 | "x": 330, 2910 | "y": 260, 2911 | "wires": [ 2912 | [ 2913 | "18463d088448ef95", 2914 | "777983a825b2d3aa", 2915 | "2c6209d9e5d7347b" 2916 | ] 2917 | ] 2918 | }, 2919 | { 2920 | "id": "18463d088448ef95", 2921 | "type": "switch", 2922 | "z": "8b54ee4c.ea65c", 2923 | "name": "Check transmitter PLI", 2924 | "property": "payload.event.bobtak[0].$.transmitter", 2925 | "propertyType": "msg", 2926 | "rules": [ 2927 | { 2928 | "t": "eq", 2929 | "v": "mycallsign", 2930 | "vt": "flow" 2931 | }, 2932 | { 2933 | "t": "neq", 2934 | "v": "mycallsign", 2935 | "vt": "flow" 2936 | } 2937 | ], 2938 | "checkall": "true", 2939 | "repair": false, 2940 | "outputs": 2, 2941 | "x": 500, 2942 | "y": 260, 2943 | "wires": [ 2944 | [ 2945 | "3ee3bfab8dec72f4" 2946 | ], 2947 | [] 2948 | ] 2949 | }, 2950 | { 2951 | "id": "7acee02aeb38e2bd", 2952 | "type": "switch", 2953 | "z": "8b54ee4c.ea65c", 2954 | "name": "Detect CoT Type", 2955 | "property": "payload.event.$.type", 2956 | "propertyType": "msg", 2957 | "rules": [ 2958 | { 2959 | "t": "regex", 2960 | "v": "a-*", 2961 | "vt": "str", 2962 | "case": false 2963 | }, 2964 | { 2965 | "t": "eq", 2966 | "v": "b-m-p-s-m", 2967 | "vt": "str" 2968 | }, 2969 | { 2970 | "t": "eq", 2971 | "v": "self", 2972 | "vt": "str" 2973 | }, 2974 | { 2975 | "t": "else" 2976 | } 2977 | ], 2978 | "checkall": "true", 2979 | "repair": false, 2980 | "outputs": 4, 2981 | "x": 1110, 2982 | "y": 380, 2983 | "wires": [ 2984 | [ 2985 | "f91d86aad6f21218" 2986 | ], 2987 | [ 2988 | "643411502d43d581" 2989 | ], 2990 | [ 2991 | "49dc9cd640d1dad4" 2992 | ], 2993 | [] 2994 | ] 2995 | }, 2996 | { 2997 | "id": "777983a825b2d3aa", 2998 | "type": "debug", 2999 | "z": "8b54ee4c.ea65c", 3000 | "name": "", 3001 | "active": false, 3002 | "tosidebar": true, 3003 | "console": false, 3004 | "tostatus": false, 3005 | "complete": "true", 3006 | "targetType": "full", 3007 | "statusVal": "", 3008 | "statusType": "auto", 3009 | "x": 450, 3010 | "y": 180, 3011 | "wires": [] 3012 | }, 3013 | { 3014 | "id": "e52d0a89e4d81ad1", 3015 | "type": "debug", 3016 | "z": "8b54ee4c.ea65c", 3017 | "name": "", 3018 | "active": false, 3019 | "tosidebar": true, 3020 | "console": false, 3021 | "tostatus": false, 3022 | "complete": "true", 3023 | "targetType": "full", 3024 | "statusVal": "", 3025 | "statusType": "auto", 3026 | "x": 3270, 3027 | "y": 660, 3028 | "wires": [] 3029 | }, 3030 | { 3031 | "id": "3ee3bfab8dec72f4", 3032 | "type": "switch", 3033 | "z": "8b54ee4c.ea65c", 3034 | "name": "Detect geochat", 3035 | "property": "payload.bobtak.$.type", 3036 | "propertyType": "msg", 3037 | "rules": [ 3038 | { 3039 | "t": "eq", 3040 | "v": "geochat", 3041 | "vt": "str" 3042 | }, 3043 | { 3044 | "t": "else" 3045 | } 3046 | ], 3047 | "checkall": "true", 3048 | "repair": false, 3049 | "outputs": 2, 3050 | "x": 620, 3051 | "y": 200, 3052 | "wires": [ 3053 | [ 3054 | "ac378ea83991dd91" 3055 | ], 3056 | [ 3057 | "aad957459ddb8fb7" 3058 | ] 3059 | ] 3060 | }, 3061 | { 3062 | "id": "bbf1ff98e671e6e5", 3063 | "type": "function", 3064 | "z": "8b54ee4c.ea65c", 3065 | "name": "Make geochat message", 3066 | "func": "const txdata = msg.payload.JS8callgroup + \" 3,\" + msg.payload.bobtak.$.callsign + \",\" + msg.payload.bobtak.$.text\n\nmsg.payload = {\n type: \"TX.SEND_MESSAGE\", value: txdata\n}\nreturn msg;", 3067 | "outputs": 1, 3068 | "noerr": 0, 3069 | "initialize": "", 3070 | "finalize": "", 3071 | "libs": [], 3072 | "x": 1130, 3073 | "y": 200, 3074 | "wires": [ 3075 | [ 3076 | "f714786d9a30b660" 3077 | ] 3078 | ] 3079 | }, 3080 | { 3081 | "id": "2c6209d9e5d7347b", 3082 | "type": "switch", 3083 | "z": "8b54ee4c.ea65c", 3084 | "name": "Check transmitter geochat", 3085 | "property": "payload.bobtak.$.transmitter", 3086 | "propertyType": "msg", 3087 | "rules": [ 3088 | { 3089 | "t": "eq", 3090 | "v": "mycallsign", 3091 | "vt": "flow" 3092 | }, 3093 | { 3094 | "t": "neq", 3095 | "v": "mycallsign", 3096 | "vt": "flow" 3097 | } 3098 | ], 3099 | "checkall": "true", 3100 | "repair": false, 3101 | "outputs": 2, 3102 | "x": 510, 3103 | "y": 300, 3104 | "wires": [ 3105 | [ 3106 | "3ee3bfab8dec72f4" 3107 | ], 3108 | [] 3109 | ] 3110 | }, 3111 | { 3112 | "id": "aad957459ddb8fb7", 3113 | "type": "switch", 3114 | "z": "8b54ee4c.ea65c", 3115 | "name": "Detect PLI", 3116 | "property": "payload.event.bobtak[0].$.type", 3117 | "propertyType": "msg", 3118 | "rules": [ 3119 | { 3120 | "t": "eq", 3121 | "v": "pli", 3122 | "vt": "str" 3123 | }, 3124 | { 3125 | "t": "else" 3126 | } 3127 | ], 3128 | "checkall": "true", 3129 | "repair": false, 3130 | "outputs": 2, 3131 | "x": 730, 3132 | "y": 240, 3133 | "wires": [ 3134 | [ 3135 | "01db7a011770e39f" 3136 | ], 3137 | [] 3138 | ] 3139 | }, 3140 | { 3141 | "id": "65a1ddd1b49e0772", 3142 | "type": "change", 3143 | "z": "8b54ee4c.ea65c", 3144 | "g": "5ec0d079efd20beb", 3145 | "name": "", 3146 | "rules": [ 3147 | { 3148 | "t": "move", 3149 | "p": "payload", 3150 | "pt": "msg", 3151 | "to": "payload_orig", 3152 | "tot": "msg" 3153 | }, 3154 | { 3155 | "t": "set", 3156 | "p": "payload", 3157 | "pt": "msg", 3158 | "to": "payload_orig.value", 3159 | "tot": "msg" 3160 | } 3161 | ], 3162 | "action": "", 3163 | "property": "", 3164 | "from": "", 3165 | "to": "", 3166 | "reg": false, 3167 | "x": 240, 3168 | "y": 1940, 3169 | "wires": [ 3170 | [ 3171 | "c0308c2c6ae10a1a" 3172 | ] 3173 | ] 3174 | }, 3175 | { 3176 | "id": "c0308c2c6ae10a1a", 3177 | "type": "split", 3178 | "z": "8b54ee4c.ea65c", 3179 | "g": "5ec0d079efd20beb", 3180 | "name": "", 3181 | "splt": " ", 3182 | "spltType": "str", 3183 | "arraySplt": 1, 3184 | "arraySpltType": "len", 3185 | "stream": false, 3186 | "addname": "", 3187 | "x": 390, 3188 | "y": 1940, 3189 | "wires": [ 3190 | [ 3191 | "501769a9dfd19495" 3192 | ] 3193 | ] 3194 | }, 3195 | { 3196 | "id": "501769a9dfd19495", 3197 | "type": "switch", 3198 | "z": "8b54ee4c.ea65c", 3199 | "g": "5ec0d079efd20beb", 3200 | "name": "Split away callsigns", 3201 | "property": "parts.index", 3202 | "propertyType": "msg", 3203 | "rules": [ 3204 | { 3205 | "t": "eq", 3206 | "v": "0", 3207 | "vt": "str" 3208 | }, 3209 | { 3210 | "t": "else" 3211 | } 3212 | ], 3213 | "checkall": "true", 3214 | "repair": false, 3215 | "outputs": 2, 3216 | "x": 550, 3217 | "y": 1940, 3218 | "wires": [ 3219 | [], 3220 | [ 3221 | "8143a92a8e362b1d" 3222 | ] 3223 | ] 3224 | }, 3225 | { 3226 | "id": "38f69ab9b13da07e", 3227 | "type": "join", 3228 | "z": "8b54ee4c.ea65c", 3229 | "g": "5ec0d079efd20beb", 3230 | "name": "", 3231 | "mode": "auto", 3232 | "build": "object", 3233 | "property": "payload", 3234 | "propertyType": "msg", 3235 | "key": "topic", 3236 | "joiner": "\\n", 3237 | "joinerType": "str", 3238 | "accumulate": "false", 3239 | "timeout": "", 3240 | "count": "", 3241 | "reduceRight": false, 3242 | "x": 890, 3243 | "y": 1940, 3244 | "wires": [ 3245 | [ 3246 | "37b3df945dc35c96" 3247 | ] 3248 | ] 3249 | }, 3250 | { 3251 | "id": "8143a92a8e362b1d", 3252 | "type": "change", 3253 | "z": "8b54ee4c.ea65c", 3254 | "g": "5ec0d079efd20beb", 3255 | "name": "Renumber index", 3256 | "rules": [ 3257 | { 3258 | "t": "set", 3259 | "p": "parts.index", 3260 | "pt": "msg", 3261 | "to": "msg.parts.index - 1", 3262 | "tot": "jsonata" 3263 | }, 3264 | { 3265 | "t": "set", 3266 | "p": "parts.count", 3267 | "pt": "msg", 3268 | "to": "msg.parts.count -1", 3269 | "tot": "jsonata" 3270 | } 3271 | ], 3272 | "action": "", 3273 | "property": "", 3274 | "from": "", 3275 | "to": "", 3276 | "reg": false, 3277 | "x": 740, 3278 | "y": 1940, 3279 | "wires": [ 3280 | [ 3281 | "38f69ab9b13da07e" 3282 | ] 3283 | ] 3284 | }, 3285 | { 3286 | "id": "75125c7085f21e84", 3287 | "type": "link in", 3288 | "z": "8b54ee4c.ea65c", 3289 | "g": "5ec0d079efd20beb", 3290 | "name": "", 3291 | "links": [ 3292 | "b78eba0f6880482b" 3293 | ], 3294 | "x": 115, 3295 | "y": 1940, 3296 | "wires": [ 3297 | [ 3298 | "65a1ddd1b49e0772" 3299 | ] 3300 | ] 3301 | }, 3302 | { 3303 | "id": "37b3df945dc35c96", 3304 | "type": "link out", 3305 | "z": "8b54ee4c.ea65c", 3306 | "g": "5ec0d079efd20beb", 3307 | "name": "", 3308 | "mode": "link", 3309 | "links": [ 3310 | "69cf7a5aa3cc1bc7" 3311 | ], 3312 | "x": 975, 3313 | "y": 1940, 3314 | "wires": [] 3315 | }, 3316 | { 3317 | "id": "69cf7a5aa3cc1bc7", 3318 | "type": "link in", 3319 | "z": "8b54ee4c.ea65c", 3320 | "name": "", 3321 | "links": [ 3322 | "37b3df945dc35c96" 3323 | ], 3324 | "x": 515, 3325 | "y": 940, 3326 | "wires": [ 3327 | [ 3328 | "c2e55.f8fc49ab" 3329 | ] 3330 | ] 3331 | }, 3332 | { 3333 | "id": "b78eba0f6880482b", 3334 | "type": "link out", 3335 | "z": "8b54ee4c.ea65c", 3336 | "name": "", 3337 | "mode": "link", 3338 | "links": [ 3339 | "75125c7085f21e84" 3340 | ], 3341 | "x": 175, 3342 | "y": 560, 3343 | "wires": [] 3344 | }, 3345 | { 3346 | "id": "82caa97e934cd247", 3347 | "type": "change", 3348 | "z": "8b54ee4c.ea65c", 3349 | "g": "6b96f7fd166dd3d7", 3350 | "name": "", 3351 | "rules": [ 3352 | { 3353 | "t": "set", 3354 | "p": "data.callsign", 3355 | "pt": "msg", 3356 | "to": "payload.params.FROM", 3357 | "tot": "msg" 3358 | }, 3359 | { 3360 | "t": "set", 3361 | "p": "data.snr", 3362 | "pt": "msg", 3363 | "to": "payload.params.SNR", 3364 | "tot": "msg" 3365 | }, 3366 | { 3367 | "t": "set", 3368 | "p": "data.to", 3369 | "pt": "msg", 3370 | "to": "payload.params.TO", 3371 | "tot": "msg" 3372 | }, 3373 | { 3374 | "t": "move", 3375 | "p": "payload", 3376 | "pt": "msg", 3377 | "to": "payload_orig", 3378 | "tot": "msg" 3379 | }, 3380 | { 3381 | "t": "set", 3382 | "p": "payload", 3383 | "pt": "msg", 3384 | "to": "payload_orig.value", 3385 | "tot": "msg" 3386 | } 3387 | ], 3388 | "action": "", 3389 | "property": "", 3390 | "from": "", 3391 | "to": "", 3392 | "reg": false, 3393 | "x": 180, 3394 | "y": 1680, 3395 | "wires": [ 3396 | [ 3397 | "80ef503301041999" 3398 | ] 3399 | ] 3400 | }, 3401 | { 3402 | "id": "1ab91bc8560a9188", 3403 | "type": "switch", 3404 | "z": "8b54ee4c.ea65c", 3405 | "g": "5b352d1787ba366a", 3406 | "name": "Detect JS8callgroup", 3407 | "property": "payload.bobtak.$.JS8callgroup", 3408 | "propertyType": "msg", 3409 | "rules": [ 3410 | { 3411 | "t": "empty" 3412 | }, 3413 | { 3414 | "t": "nempty" 3415 | } 3416 | ], 3417 | "checkall": "true", 3418 | "repair": false, 3419 | "outputs": 2, 3420 | "x": 2340, 3421 | "y": 120, 3422 | "wires": [ 3423 | [ 3424 | "ed5a3b3863b5385b" 3425 | ], 3426 | [ 3427 | "89cd6073df0b8d32" 3428 | ] 3429 | ] 3430 | }, 3431 | { 3432 | "id": "ed5a3b3863b5385b", 3433 | "type": "change", 3434 | "z": "8b54ee4c.ea65c", 3435 | "g": "5b352d1787ba366a", 3436 | "name": "", 3437 | "rules": [ 3438 | { 3439 | "t": "set", 3440 | "p": "payload.JS8callgroup", 3441 | "pt": "msg", 3442 | "to": "@BOBTAK", 3443 | "tot": "str" 3444 | } 3445 | ], 3446 | "action": "", 3447 | "property": "", 3448 | "from": "", 3449 | "to": "", 3450 | "reg": false, 3451 | "x": 2590, 3452 | "y": 100, 3453 | "wires": [ 3454 | [ 3455 | "eb1f747bead120a5" 3456 | ] 3457 | ] 3458 | }, 3459 | { 3460 | "id": "89cd6073df0b8d32", 3461 | "type": "change", 3462 | "z": "8b54ee4c.ea65c", 3463 | "g": "5b352d1787ba366a", 3464 | "name": "", 3465 | "rules": [ 3466 | { 3467 | "t": "set", 3468 | "p": "payload.JS8callgroup", 3469 | "pt": "msg", 3470 | "to": "payload.bobtak.$.JS8callgroup", 3471 | "tot": "msg" 3472 | } 3473 | ], 3474 | "action": "", 3475 | "property": "", 3476 | "from": "", 3477 | "to": "", 3478 | "reg": false, 3479 | "x": 2590, 3480 | "y": 140, 3481 | "wires": [ 3482 | [ 3483 | "eb1f747bead120a5" 3484 | ] 3485 | ] 3486 | }, 3487 | { 3488 | "id": "536eb58a44e4fc48", 3489 | "type": "link in", 3490 | "z": "8b54ee4c.ea65c", 3491 | "g": "5b352d1787ba366a", 3492 | "name": "TX Config geochat JS8callgroup", 3493 | "links": [], 3494 | "x": 2195, 3495 | "y": 120, 3496 | "wires": [ 3497 | [ 3498 | "1ab91bc8560a9188" 3499 | ] 3500 | ] 3501 | }, 3502 | { 3503 | "id": "eb1f747bead120a5", 3504 | "type": "link out", 3505 | "z": "8b54ee4c.ea65c", 3506 | "g": "5b352d1787ba366a", 3507 | "name": "TX Configured Geochat JS8callgroup", 3508 | "mode": "return", 3509 | "links": [], 3510 | "x": 2755, 3511 | "y": 120, 3512 | "wires": [] 3513 | }, 3514 | { 3515 | "id": "755b419c2bebddd5", 3516 | "type": "switch", 3517 | "z": "8b54ee4c.ea65c", 3518 | "g": "4f0ebd4782d45849", 3519 | "name": "Detect JS8callgroup", 3520 | "property": "payload.event.bobtak[0].$.JS8callgroup", 3521 | "propertyType": "msg", 3522 | "rules": [ 3523 | { 3524 | "t": "empty" 3525 | }, 3526 | { 3527 | "t": "nempty" 3528 | } 3529 | ], 3530 | "checkall": "true", 3531 | "repair": false, 3532 | "outputs": 2, 3533 | "x": 2340, 3534 | "y": 260, 3535 | "wires": [ 3536 | [ 3537 | "e4d8ea31a3950453" 3538 | ], 3539 | [ 3540 | "4779f53da636c316" 3541 | ] 3542 | ] 3543 | }, 3544 | { 3545 | "id": "e4d8ea31a3950453", 3546 | "type": "change", 3547 | "z": "8b54ee4c.ea65c", 3548 | "g": "4f0ebd4782d45849", 3549 | "name": "", 3550 | "rules": [ 3551 | { 3552 | "t": "set", 3553 | "p": "payload.JS8callgroup", 3554 | "pt": "msg", 3555 | "to": "@BOBTAK", 3556 | "tot": "str" 3557 | } 3558 | ], 3559 | "action": "", 3560 | "property": "", 3561 | "from": "", 3562 | "to": "", 3563 | "reg": false, 3564 | "x": 2590, 3565 | "y": 240, 3566 | "wires": [ 3567 | [ 3568 | "494b9a383961e724" 3569 | ] 3570 | ] 3571 | }, 3572 | { 3573 | "id": "4779f53da636c316", 3574 | "type": "change", 3575 | "z": "8b54ee4c.ea65c", 3576 | "g": "4f0ebd4782d45849", 3577 | "name": "", 3578 | "rules": [ 3579 | { 3580 | "t": "set", 3581 | "p": "payload.JS8callgroup", 3582 | "pt": "msg", 3583 | "to": "payload.event.bobtak[0].$.JS8callgroup", 3584 | "tot": "msg" 3585 | } 3586 | ], 3587 | "action": "", 3588 | "property": "", 3589 | "from": "", 3590 | "to": "", 3591 | "reg": false, 3592 | "x": 2590, 3593 | "y": 280, 3594 | "wires": [ 3595 | [ 3596 | "494b9a383961e724" 3597 | ] 3598 | ] 3599 | }, 3600 | { 3601 | "id": "7d9a281b184ee894", 3602 | "type": "link in", 3603 | "z": "8b54ee4c.ea65c", 3604 | "g": "4f0ebd4782d45849", 3605 | "name": "TX Config PLI JS8callgroup", 3606 | "links": [], 3607 | "x": 2195, 3608 | "y": 260, 3609 | "wires": [ 3610 | [ 3611 | "755b419c2bebddd5" 3612 | ] 3613 | ] 3614 | }, 3615 | { 3616 | "id": "494b9a383961e724", 3617 | "type": "link out", 3618 | "z": "8b54ee4c.ea65c", 3619 | "g": "4f0ebd4782d45849", 3620 | "name": "TX Configured PLI JS8callgroup", 3621 | "mode": "return", 3622 | "links": [], 3623 | "x": 2755, 3624 | "y": 260, 3625 | "wires": [] 3626 | }, 3627 | { 3628 | "id": "ac378ea83991dd91", 3629 | "type": "link call", 3630 | "z": "8b54ee4c.ea65c", 3631 | "name": "", 3632 | "links": [ 3633 | "536eb58a44e4fc48" 3634 | ], 3635 | "timeout": "30", 3636 | "x": 870, 3637 | "y": 200, 3638 | "wires": [ 3639 | [ 3640 | "bbf1ff98e671e6e5" 3641 | ] 3642 | ] 3643 | }, 3644 | { 3645 | "id": "67ecd27d65370b3a", 3646 | "type": "xml", 3647 | "z": "8b54ee4c.ea65c", 3648 | "name": "", 3649 | "property": "payload", 3650 | "attr": "", 3651 | "chr": "", 3652 | "x": 230, 3653 | "y": 200, 3654 | "wires": [ 3655 | [ 3656 | "3ee3bfab8dec72f4" 3657 | ] 3658 | ] 3659 | }, 3660 | { 3661 | "id": "01db7a011770e39f", 3662 | "type": "change", 3663 | "z": "8b54ee4c.ea65c", 3664 | "name": "Rename values", 3665 | "rules": [ 3666 | { 3667 | "t": "set", 3668 | "p": "payload.uid", 3669 | "pt": "msg", 3670 | "to": "payload.event.$.uid", 3671 | "tot": "msg" 3672 | }, 3673 | { 3674 | "t": "set", 3675 | "p": "payload.lat", 3676 | "pt": "msg", 3677 | "to": "payload.event.point[0].$.lat", 3678 | "tot": "msg", 3679 | "dc": true 3680 | }, 3681 | { 3682 | "t": "set", 3683 | "p": "payload.lon", 3684 | "pt": "msg", 3685 | "to": "payload.event.point[0].$.lon", 3686 | "tot": "msg", 3687 | "dc": true 3688 | }, 3689 | { 3690 | "t": "set", 3691 | "p": "payload.callsign", 3692 | "pt": "msg", 3693 | "to": "payload.event.detail[0].contact[0].$.callsign", 3694 | "tot": "msg" 3695 | }, 3696 | { 3697 | "t": "set", 3698 | "p": "payload.uid", 3699 | "pt": "msg", 3700 | "to": "$substring(msg.payload.uid, $length(msg.payload.uid)-5, 5)", 3701 | "tot": "jsonata" 3702 | } 3703 | ], 3704 | "action": "", 3705 | "property": "", 3706 | "from": "", 3707 | "to": "", 3708 | "reg": false, 3709 | "x": 920, 3710 | "y": 240, 3711 | "wires": [ 3712 | [ 3713 | "7acee02aeb38e2bd", 3714 | "f9eae50c7b799d58" 3715 | ] 3716 | ] 3717 | }, 3718 | { 3719 | "id": "f91d86aad6f21218", 3720 | "type": "link out", 3721 | "z": "8b54ee4c.ea65c", 3722 | "g": "359c668394a8e40c", 3723 | "name": "To 2525C In", 3724 | "mode": "link", 3725 | "links": [ 3726 | "32613f47cac9874a" 3727 | ], 3728 | "x": 1295, 3729 | "y": 280, 3730 | "wires": [] 3731 | }, 3732 | { 3733 | "id": "367e8f7477adf203", 3734 | "type": "function", 3735 | "z": "8b54ee4c.ea65c", 3736 | "g": "b0dff7256fa3aa44", 3737 | "name": "lat lon to maidenhead", 3738 | "func": "inlat = +msg.payload.lat\ninlon = +msg.payload.lon\n\nlonR1 = inlon + 180\nlatR1 = inlat + 90\n\nlon1 = Math.floor( lonR1 / 20 )\nlat1 = Math.floor( latR1 / 10 )\n\nlonR2 = lonR1 - ( lon1 * 20 )\nlatR2 = latR1 - ( lat1 * 10 )\n\nlon2 = Math.floor( lonR2 / 2 )\nlat2 = Math.floor( latR2 / 1 )\n\nlonR3 = lonR2 - ( lon2 * 2 )\nlatR3 = latR2 - ( lat2 * 1 )\n\nlon3 = Math.floor( lonR3 * 12 )\nlat3 = Math.floor( latR3 * 24 )\n\nlonR4 = lonR3 - ( lon3 / 12 )\nlatR4 = latR3 - ( lat3 / 24 )\n\nlon4 = Math.floor( lonR4 * 120 )\nlat4 = Math.floor( latR4 * 240 )\n\nlonR5 = lonR4 - ( lon4 / 120 )\nlatR5 = latR4 - ( lat4 / 240 )\n\nlon5 = Math.floor( lonR5 * 2880 )\nlat5 = Math.floor( latR5 * 5760 )\n\nfieldlon = String.fromCharCode( lon1 + 65 )\nfieldlat = String.fromCharCode( lat1 + 65 )\ngridlon = lon2\ngridlat = lat2\nsublon = String.fromCharCode( lon3 + 65 )\nsublat = String.fromCharCode( lat3 + 65 )\nextlon = lon4\nextlat = lat4\nsslon = String.fromCharCode( lon5 + 65 )\nsslat = String.fromCharCode( lat5 + 65 )\n\n//msg.payload.lon1 = lonR1\n//msg.payload.lon2 = latR1\nmsg.payload.maidenhead = fieldlon + fieldlat + gridlon + gridlat + sublon + sublat + extlon + extlat + sslon + sslat\nreturn msg;", 3739 | "outputs": 1, 3740 | "noerr": 0, 3741 | "initialize": "", 3742 | "finalize": "", 3743 | "libs": [], 3744 | "x": 2340, 3745 | "y": 380, 3746 | "wires": [ 3747 | [ 3748 | "ee65ac27d1748118" 3749 | ] 3750 | ] 3751 | }, 3752 | { 3753 | "id": "470aa654060aeb9f", 3754 | "type": "link in", 3755 | "z": "8b54ee4c.ea65c", 3756 | "g": "b0dff7256fa3aa44", 3757 | "name": "Create Maidenhead", 3758 | "links": [], 3759 | "x": 2195, 3760 | "y": 380, 3761 | "wires": [ 3762 | [ 3763 | "367e8f7477adf203" 3764 | ] 3765 | ] 3766 | }, 3767 | { 3768 | "id": "ee65ac27d1748118", 3769 | "type": "link out", 3770 | "z": "8b54ee4c.ea65c", 3771 | "g": "b0dff7256fa3aa44", 3772 | "name": "Created Maidenhead", 3773 | "mode": "return", 3774 | "links": [], 3775 | "x": 2475, 3776 | "y": 380, 3777 | "wires": [] 3778 | }, 3779 | { 3780 | "id": "51bed90fe56b8ba1", 3781 | "type": "change", 3782 | "z": "8b54ee4c.ea65c", 3783 | "g": "1ec75a897fad92ff", 3784 | "name": "Rename values", 3785 | "rules": [ 3786 | { 3787 | "t": "set", 3788 | "p": "payload.milstd_type", 3789 | "pt": "msg", 3790 | "to": "payload.event.$.type", 3791 | "tot": "msg" 3792 | } 3793 | ], 3794 | "action": "", 3795 | "property": "", 3796 | "from": "", 3797 | "to": "", 3798 | "reg": false, 3799 | "x": 2320, 3800 | "y": 480, 3801 | "wires": [ 3802 | [ 3803 | "1d26247fa1916339" 3804 | ] 3805 | ] 3806 | }, 3807 | { 3808 | "id": "1d26247fa1916339", 3809 | "type": "change", 3810 | "z": "8b54ee4c.ea65c", 3811 | "g": "1ec75a897fad92ff", 3812 | "name": "", 3813 | "rules": [ 3814 | { 3815 | "t": "set", 3816 | "p": "payload.milstd_type", 3817 | "pt": "msg", 3818 | "to": "$substringAfter(msg.payload.milstd_type, \"-\")\t", 3819 | "tot": "jsonata" 3820 | } 3821 | ], 3822 | "action": "", 3823 | "property": "", 3824 | "from": "", 3825 | "to": "", 3826 | "reg": false, 3827 | "x": 2540, 3828 | "y": 480, 3829 | "wires": [ 3830 | [ 3831 | "1b75dd0903f69888" 3832 | ] 3833 | ] 3834 | }, 3835 | { 3836 | "id": "1b75dd0903f69888", 3837 | "type": "link call", 3838 | "z": "8b54ee4c.ea65c", 3839 | "g": "1ec75a897fad92ff", 3840 | "name": "", 3841 | "links": [ 3842 | "7d9a281b184ee894" 3843 | ], 3844 | "timeout": "30", 3845 | "x": 2800, 3846 | "y": 480, 3847 | "wires": [ 3848 | [ 3849 | "d1d20e3c1c32b38e", 3850 | "a53ef850deda9c67" 3851 | ] 3852 | ] 3853 | }, 3854 | { 3855 | "id": "32613f47cac9874a", 3856 | "type": "link in", 3857 | "z": "8b54ee4c.ea65c", 3858 | "g": "1ec75a897fad92ff", 3859 | "name": "Type 2525C In", 3860 | "links": [ 3861 | "f91d86aad6f21218" 3862 | ], 3863 | "x": 2195, 3864 | "y": 480, 3865 | "wires": [ 3866 | [ 3867 | "51bed90fe56b8ba1" 3868 | ] 3869 | ] 3870 | }, 3871 | { 3872 | "id": "6446d7a3969bd6a4", 3873 | "type": "function", 3874 | "z": "8b54ee4c.ea65c", 3875 | "g": "1ec75a897fad92ff", 3876 | "name": "Make PLI message", 3877 | "func": "//txdata =msg.payload.callsign + \",\" + msg.payload.lat + \",\" + msg.payload.lon\n// replaced lat/lon with maidenhead\nconst txdata = msg.payload.JS8callgroup+ \" 1,\" +msg.payload.callsign+ \",\" +msg.payload.uid+ \",\" +msg.payload.milstd_type+ \",\" +msg.payload.maidenhead\nmsg.payload = {\n type:\"TX.SEND_MESSAGE\",value:txdata\n}\nreturn msg;", 3878 | "outputs": 1, 3879 | "noerr": 0, 3880 | "initialize": "", 3881 | "finalize": "", 3882 | "libs": [], 3883 | "x": 3230, 3884 | "y": 480, 3885 | "wires": [ 3886 | [ 3887 | "b9cd668bc0c33938" 3888 | ] 3889 | ] 3890 | }, 3891 | { 3892 | "id": "a53ef850deda9c67", 3893 | "type": "link call", 3894 | "z": "8b54ee4c.ea65c", 3895 | "g": "1ec75a897fad92ff", 3896 | "name": "", 3897 | "links": [ 3898 | "470aa654060aeb9f" 3899 | ], 3900 | "timeout": "30", 3901 | "x": 3030, 3902 | "y": 480, 3903 | "wires": [ 3904 | [ 3905 | "6446d7a3969bd6a4" 3906 | ] 3907 | ] 3908 | }, 3909 | { 3910 | "id": "b9cd668bc0c33938", 3911 | "type": "link out", 3912 | "z": "8b54ee4c.ea65c", 3913 | "g": "1ec75a897fad92ff", 3914 | "name": "To Send JS8call", 3915 | "mode": "link", 3916 | "links": [ 3917 | "38a9983825247a1f" 3918 | ], 3919 | "x": 3355, 3920 | "y": 480, 3921 | "wires": [] 3922 | }, 3923 | { 3924 | "id": "38a9983825247a1f", 3925 | "type": "link in", 3926 | "z": "8b54ee4c.ea65c", 3927 | "name": "Send JS8call", 3928 | "links": [ 3929 | "b9cd668bc0c33938", 3930 | "7bb24ad8d7c37980", 3931 | "c00c1e0fb92ec026" 3932 | ], 3933 | "x": 1395, 3934 | "y": 320, 3935 | "wires": [ 3936 | [ 3937 | "f714786d9a30b660" 3938 | ] 3939 | ] 3940 | }, 3941 | { 3942 | "id": "643411502d43d581", 3943 | "type": "link out", 3944 | "z": "8b54ee4c.ea65c", 3945 | "g": "2ccd90acf36c6d03", 3946 | "name": "To Spot In", 3947 | "mode": "link", 3948 | "links": [ 3949 | "54fc24c83a9842d7", 3950 | "90f268492d7b9875" 3951 | ], 3952 | "x": 1295, 3953 | "y": 360, 3954 | "wires": [] 3955 | }, 3956 | { 3957 | "id": "54fc24c83a9842d7", 3958 | "type": "link in", 3959 | "z": "8b54ee4c.ea65c", 3960 | "g": "f373302b37579192", 3961 | "name": "Type Spot In", 3962 | "links": [ 3963 | "643411502d43d581" 3964 | ], 3965 | "x": 2195, 3966 | "y": 580, 3967 | "wires": [ 3968 | [ 3969 | "286bad5908c4b4c7" 3970 | ] 3971 | ] 3972 | }, 3973 | { 3974 | "id": "286bad5908c4b4c7", 3975 | "type": "change", 3976 | "z": "8b54ee4c.ea65c", 3977 | "g": "f373302b37579192", 3978 | "name": "Rename values", 3979 | "rules": [ 3980 | { 3981 | "t": "set", 3982 | "p": "payload.spot_type", 3983 | "pt": "msg", 3984 | "to": "payload.event.detail[0].usericon[0].$.iconsetpath", 3985 | "tot": "msg" 3986 | } 3987 | ], 3988 | "action": "", 3989 | "property": "", 3990 | "from": "", 3991 | "to": "", 3992 | "reg": false, 3993 | "x": 2320, 3994 | "y": 580, 3995 | "wires": [ 3996 | [ 3997 | "074900fadc9e3fe4" 3998 | ] 3999 | ] 4000 | }, 4001 | { 4002 | "id": "074900fadc9e3fe4", 4003 | "type": "change", 4004 | "z": "8b54ee4c.ea65c", 4005 | "g": "f373302b37579192", 4006 | "name": "", 4007 | "rules": [ 4008 | { 4009 | "t": "set", 4010 | "p": "payload.spot_type", 4011 | "pt": "msg", 4012 | "to": "$substringAfter(msg.payload.spot_type, \"b-m-p-s-m/-\")\t", 4013 | "tot": "jsonata" 4014 | } 4015 | ], 4016 | "action": "", 4017 | "property": "", 4018 | "from": "", 4019 | "to": "", 4020 | "reg": false, 4021 | "x": 2540, 4022 | "y": 580, 4023 | "wires": [ 4024 | [ 4025 | "fb736a616b77a9f1" 4026 | ] 4027 | ] 4028 | }, 4029 | { 4030 | "id": "fb736a616b77a9f1", 4031 | "type": "link call", 4032 | "z": "8b54ee4c.ea65c", 4033 | "g": "f373302b37579192", 4034 | "name": "", 4035 | "links": [ 4036 | "7d9a281b184ee894" 4037 | ], 4038 | "timeout": "30", 4039 | "x": 2800, 4040 | "y": 580, 4041 | "wires": [ 4042 | [ 4043 | "33be524aac971e24" 4044 | ] 4045 | ] 4046 | }, 4047 | { 4048 | "id": "33be524aac971e24", 4049 | "type": "link call", 4050 | "z": "8b54ee4c.ea65c", 4051 | "g": "f373302b37579192", 4052 | "name": "", 4053 | "links": [ 4054 | "470aa654060aeb9f" 4055 | ], 4056 | "timeout": "30", 4057 | "x": 3030, 4058 | "y": 580, 4059 | "wires": [ 4060 | [ 4061 | "12797457b0227b27" 4062 | ] 4063 | ] 4064 | }, 4065 | { 4066 | "id": "12797457b0227b27", 4067 | "type": "function", 4068 | "z": "8b54ee4c.ea65c", 4069 | "g": "f373302b37579192", 4070 | "name": "Make PLI message", 4071 | "func": "//txdata =msg.payload.callsign + \",\" + msg.payload.lat + \",\" + msg.payload.lon\n// replaced lat/lon with maidenhead\nconst txdata = msg.payload.JS8callgroup+ \" 2,\" +msg.payload.callsign+ \",\" +msg.payload.uid+ \",\" +msg.payload.spot_type+ \",\" +msg.payload.maidenhead\nmsg.payload = {\n type:\"TX.SEND_MESSAGE\",value:txdata\n}\nreturn msg;", 4072 | "outputs": 1, 4073 | "noerr": 0, 4074 | "initialize": "", 4075 | "finalize": "", 4076 | "libs": [], 4077 | "x": 3230, 4078 | "y": 580, 4079 | "wires": [ 4080 | [ 4081 | "7bb24ad8d7c37980" 4082 | ] 4083 | ] 4084 | }, 4085 | { 4086 | "id": "7bb24ad8d7c37980", 4087 | "type": "link out", 4088 | "z": "8b54ee4c.ea65c", 4089 | "g": "f373302b37579192", 4090 | "name": "To Send JS8call", 4091 | "mode": "link", 4092 | "links": [ 4093 | "38a9983825247a1f" 4094 | ], 4095 | "x": 3355, 4096 | "y": 580, 4097 | "wires": [] 4098 | }, 4099 | { 4100 | "id": "e7436f4e11e44234", 4101 | "type": "change", 4102 | "z": "8b54ee4c.ea65c", 4103 | "g": "466f58d6f321e8bc", 4104 | "name": "", 4105 | "rules": [ 4106 | { 4107 | "t": "move", 4108 | "p": "payload", 4109 | "pt": "msg", 4110 | "to": "payloadArray", 4111 | "tot": "msg" 4112 | }, 4113 | { 4114 | "t": "set", 4115 | "p": "payload.callsign", 4116 | "pt": "msg", 4117 | "to": "payloadArray[1]", 4118 | "tot": "msg" 4119 | }, 4120 | { 4121 | "t": "set", 4122 | "p": "payload.uid", 4123 | "pt": "msg", 4124 | "to": "payloadArray[2]", 4125 | "tot": "msg" 4126 | }, 4127 | { 4128 | "t": "set", 4129 | "p": "payload.spot_type", 4130 | "pt": "msg", 4131 | "to": "payloadArray[3]", 4132 | "tot": "msg" 4133 | }, 4134 | { 4135 | "t": "set", 4136 | "p": "payload.Maidenhead", 4137 | "pt": "msg", 4138 | "to": "payloadArray[4]", 4139 | "tot": "msg" 4140 | }, 4141 | { 4142 | "t": "delete", 4143 | "p": "payloadArray", 4144 | "pt": "msg" 4145 | }, 4146 | { 4147 | "t": "delete", 4148 | "p": "payload_orig", 4149 | "pt": "msg" 4150 | } 4151 | ], 4152 | "action": "", 4153 | "property": "", 4154 | "from": "", 4155 | "to": "", 4156 | "reg": false, 4157 | "x": 1080, 4158 | "y": 1220, 4159 | "wires": [ 4160 | [ 4161 | "627aded5e71ed0b2" 4162 | ] 4163 | ] 4164 | }, 4165 | { 4166 | "id": "627aded5e71ed0b2", 4167 | "type": "function", 4168 | "z": "8b54ee4c.ea65c", 4169 | "g": "466f58d6f321e8bc", 4170 | "name": "Maidenhead -> Lat, Lon", 4171 | "func": "/*\nMaidenhead Class taken from: \n https://github.com/mehmetc/Maidenhead\nAuthor: Mehmet Celik\nLicense: MIT\nCopyright: Copyright 2016 Mehmet Celik\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Mehmet Celik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nclass Maidenhead {\n constructor(lat, lon, precision = 5){\n this.lat = lat;\n this.lon = lon;\n this.precision = precision;\n }\n\n static valid(mlocation){\n if (typeof mlocation !== 'string') {\n return false;\n }\n\n if (mlocation.length < 2) {\n return false;\n }\n\n if ((mlocation.length % 2) !== 0) {\n return false;\n }\n\n var length = mlocation.length / 2;\n\n for (var counter=0; counter= 0 && heading <= 360){\n var compassBearings = [\n {\"label\": \"N\", \"start\": 0, \"end\": 11},\n {\"label\": \"NNE\", \"start\": 11, \"end\": 33},\n {\"label\": \"NE\", \"start\": 34, \"end\": 56},\n {\"label\": \"ENE\", \"start\": 57, \"end\": 78},\n {\"label\": \"E\", \"start\": 79, \"end\": 101},\n {\"label\": \"ESE\", \"start\": 102, \"end\": 123},\n {\"label\": \"SE\", \"start\": 124, \"end\": 146},\n {\"label\": \"SSE\", \"start\": 147, \"end\": 168},\n {\"label\": \"S\", \"start\": 169, \"end\": 191},\n {\"label\": \"SSW\", \"start\": 192, \"end\": 213},\n {\"label\": \"SW\", \"start\": 214, \"end\": 236},\n {\"label\": \"WSW\", \"start\": 237, \"end\": 258},\n {\"label\": \"W\", \"start\":\t259, \"end\": 281},\n {\"label\": \"WNW\", \"start\": 282, \"end\": 303},\n {\"label\": \"NW\", \"start\": 304, \"end\": 326},\n {\"label\": \"NNW\", \"start\": 327, \"end\": 348},\n {\"label\": \"N\", \"start\": 349, \"end\": 360}\n ];\n\n var result = compassBearings.find(function (element, index, array) {\n if (heading > element.start && heading < element.end) {\n return true;\n }\n return false;\n });\n\n return result ? result.label : '';\n }\n }\n\n _deg_to_rad(deg) {\n return deg / 180 * Math.PI;\n }\n\n _rad_to_deg(rad) {\n return rad / Math.PI * 180;\n }\n\n _pad_locator(){\n var length = this._locator.length / 2 ;\n\n while (length < 5) {\n if ((length%2) == 1) {\n this._locator += '55';\n }\n else {\n this._locator += 'LL';\n }\n\n length = this._locator.length / 2;\n }\n }\n\n _range_check(target, range, pos) {\n pos = Number(pos);\n if (pos < -range || pos > range){\n throw target + \" must be between -\" + range + \" and +\" + range;\n }\n\n return pos;\n }\n\n _convert_part_to_latlon(counter, divisor) {\n var grid_lon = this._locator.substr(counter*2, 1);\n var grid_lat = this._locator.substr(counter*2+1, 1);\n\n this._lat += this._l2n(grid_lat) * 10.0 / divisor;\n this._lon += this._l2n(grid_lon) * 20.0 / divisor;\n }\n\n _calculate_field(){\n this.__lat = (this.__lat/10) + 0.0000001;\n this.__lon = (this.__lon/20) + 0.0000001;\n this._locator += this._n2l(Math.floor(this.__lon)).toUpperCase() + this._n2l(Math.floor(this.__lat)).toUpperCase();\n this.__precision -= 1;\n }\n\n _calculate_values(){\n for (let counter=0; counter < this.__precision;counter++) {\n if((counter%2) == 0) {\n this._compute_locator(counter, 10);\n } else {\n this._compute_locator(counter, 24);\n }\n }\n }\n\n _compute_locator(counter, divisor){\n this.__lat = (this.__lat - Math.floor(this.__lat)) * divisor;\n this.__lon = (this.__lon - Math.floor(this.__lon)) * divisor;\n\n if ((counter%2) == 0) {\n this._locator += \"\" + Math.floor(this.__lon) + \"\" + Math.floor(this.__lat)\n } else {\n this._locator += this._n2l(Math.floor(this.__lon)) + this._n2l(Math.floor(this.__lat))\n }\n }\n\n _l2n(letter){\n if (letter.match(/[0-9]+/)) {\n return parseInt(letter);\n }else{\n return letter.toLowerCase().charCodeAt(0) - 97;\n }\n\n }\n _n2l(number){\n return String.fromCharCode(97 + number);\n }\n}\n\n// Extract Maidenhead & Callsign from CQ Call:\n//let splitCopy = msg.payload.copy.split(\" \")\n//msg.payload.Maidenhead = splitCopy.pop();\n//msg.payload.callsign = splitCopy.pop();\n\n// Extract Latitute & Longitude from Maidenhead:\nmsg.payload.location = Maidenhead.toLatLon(msg.payload.Maidenhead);\n\nreturn msg;\n", 4172 | "outputs": 1, 4173 | "noerr": 0, 4174 | "initialize": "", 4175 | "finalize": "", 4176 | "libs": [], 4177 | "x": 1290, 4178 | "y": 1220, 4179 | "wires": [ 4180 | [ 4181 | "f0d9c6b02a50a38d" 4182 | ] 4183 | ] 4184 | }, 4185 | { 4186 | "id": "ede570fd6fec4f3c", 4187 | "type": "link out", 4188 | "z": "8b54ee4c.ea65c", 4189 | "g": "466f58d6f321e8bc", 4190 | "name": "Position SA", 4191 | "mode": "link", 4192 | "links": [ 4193 | "520d7c534c5146c8" 4194 | ], 4195 | "x": 1715, 4196 | "y": 1220, 4197 | "wires": [] 4198 | }, 4199 | { 4200 | "id": "f0d9c6b02a50a38d", 4201 | "type": "function", 4202 | "z": "8b54ee4c.ea65c", 4203 | "g": "466f58d6f321e8bc", 4204 | "name": "CoT", 4205 | "func": "const dt = Date.now();\nconst dtD = new Date(dt);\nconst dtD5 = new Date(dt + 14400000);\n\nmsg.payload = {\n \"event\": {\n \"$\": { \n \"version\":\"2.0\",\n \"type\":\"b-m-p-s-m\",\n \"uid\":`${msg.payload.uid}`,\n \"time\":dtD.toISOString(),\n \"start\":dtD.toISOString(),\n \"stale\":dtD5.toISOString(),\n \"how\":\"h-g-i-g-o\"\n\n },\n \"detail\": [\n {\n \"usericon\": [\n {\n \"$\": {\n \"iconsetpath\":\"COT_MAPPING_SPOTMAP/b-m-p-s-m/-\" +`${msg.payload.spot_type}`\n }\n }],\n \"contact\": [\n {\n \"$\": {\n \"callsign\":`${msg.payload.callsign}`\n }\n }],\n \"ce_human_input\":\"true\",\n \"color\": [\n {\n \"$\": {\n \"argb\":\"-\" +`${msg.payload.spot_type}`\n }\n }],\n \"remarks\":\"\",\n \"link\": [\n {\n \"$\": {\n \"uid\":\"80085\",\n \"production_time\":dtD.toISOString(),\n \"type\":\"a-f-G\",\n \"parent_callsign\":\"BOBTAK\",\n \"relation\":\"p-p\"\n }\n }],\n \"precisionlocation\": [\n {\n \"$\": {\n \"geopointsrc\":\"USER\"\n }\n }]\n }],\n \"point\": [ \n { \n \"$\": { \n \"lat\": `${msg.payload.location[0]}`, \n \"lon\": `${msg.payload.location[1]}`, \n \"hae\": \"9999999.0\", \n \"ce\": \"35.0\", \n \"le\": \"9999999.0\"\n }\n \n }\n ]\n }\n \n}\nreturn msg;", 4206 | "outputs": 1, 4207 | "noerr": 0, 4208 | "initialize": "", 4209 | "finalize": "", 4210 | "libs": [], 4211 | "x": 1470, 4212 | "y": 1220, 4213 | "wires": [ 4214 | [ 4215 | "03fcda2aa1f2eb84" 4216 | ] 4217 | ] 4218 | }, 4219 | { 4220 | "id": "03fcda2aa1f2eb84", 4221 | "type": "xml", 4222 | "z": "8b54ee4c.ea65c", 4223 | "g": "466f58d6f321e8bc", 4224 | "name": "", 4225 | "property": "payload", 4226 | "attr": "", 4227 | "chr": "", 4228 | "x": 1610, 4229 | "y": 1220, 4230 | "wires": [ 4231 | [ 4232 | "ede570fd6fec4f3c" 4233 | ] 4234 | ] 4235 | }, 4236 | { 4237 | "id": "f5e7afc455430464", 4238 | "type": "comment", 4239 | "z": "8b54ee4c.ea65c", 4240 | "g": "466f58d6f321e8bc", 4241 | "name": "Format", 4242 | "info": "2,callsign,uid,spot_type,maidenhead", 4243 | "x": 1330, 4244 | "y": 1180, 4245 | "wires": [] 4246 | }, 4247 | { 4248 | "id": "90f268492d7b9875", 4249 | "type": "link in", 4250 | "z": "8b54ee4c.ea65c", 4251 | "g": "7565a618f2df4784", 4252 | "name": "Type Self In", 4253 | "links": [ 4254 | "643411502d43d581", 4255 | "49dc9cd640d1dad4" 4256 | ], 4257 | "x": 2195, 4258 | "y": 680, 4259 | "wires": [ 4260 | [ 4261 | "6cab27ea19a8d831" 4262 | ] 4263 | ] 4264 | }, 4265 | { 4266 | "id": "6cab27ea19a8d831", 4267 | "type": "link call", 4268 | "z": "8b54ee4c.ea65c", 4269 | "g": "7565a618f2df4784", 4270 | "name": "", 4271 | "links": [ 4272 | "7d9a281b184ee894" 4273 | ], 4274 | "timeout": "30", 4275 | "x": 2360, 4276 | "y": 680, 4277 | "wires": [ 4278 | [ 4279 | "786d9dc432ef1046" 4280 | ] 4281 | ] 4282 | }, 4283 | { 4284 | "id": "786d9dc432ef1046", 4285 | "type": "link call", 4286 | "z": "8b54ee4c.ea65c", 4287 | "g": "7565a618f2df4784", 4288 | "name": "", 4289 | "links": [ 4290 | "470aa654060aeb9f" 4291 | ], 4292 | "timeout": "30", 4293 | "x": 2590, 4294 | "y": 680, 4295 | "wires": [ 4296 | [ 4297 | "c8dc18ab683aa5b9" 4298 | ] 4299 | ] 4300 | }, 4301 | { 4302 | "id": "c8dc18ab683aa5b9", 4303 | "type": "function", 4304 | "z": "8b54ee4c.ea65c", 4305 | "g": "7565a618f2df4784", 4306 | "name": "Make PLI message", 4307 | "func": "//txdata =msg.payload.callsign + \",\" + msg.payload.lat + \",\" + msg.payload.lon\n// replaced lat/lon with maidenhead\nconst txdata = msg.payload.JS8callgroup+ \" 4,\" +msg.payload.callsign+ \",\" +msg.payload.uid+ \",\" +msg.payload.maidenhead\nmsg.payload = {\n type:\"TX.SEND_MESSAGE\",value:txdata\n}\nreturn msg;", 4308 | "outputs": 1, 4309 | "noerr": 0, 4310 | "initialize": "", 4311 | "finalize": "", 4312 | "libs": [], 4313 | "x": 2790, 4314 | "y": 680, 4315 | "wires": [ 4316 | [ 4317 | "c00c1e0fb92ec026", 4318 | "e52d0a89e4d81ad1" 4319 | ] 4320 | ] 4321 | }, 4322 | { 4323 | "id": "c00c1e0fb92ec026", 4324 | "type": "link out", 4325 | "z": "8b54ee4c.ea65c", 4326 | "g": "7565a618f2df4784", 4327 | "name": "To Send JS8call", 4328 | "mode": "link", 4329 | "links": [ 4330 | "38a9983825247a1f" 4331 | ], 4332 | "x": 2915, 4333 | "y": 680, 4334 | "wires": [] 4335 | }, 4336 | { 4337 | "id": "49dc9cd640d1dad4", 4338 | "type": "link out", 4339 | "z": "8b54ee4c.ea65c", 4340 | "g": "4b44f3641f5b8a04", 4341 | "name": "To Self In", 4342 | "mode": "link", 4343 | "links": [ 4344 | "90f268492d7b9875" 4345 | ], 4346 | "x": 1295, 4347 | "y": 440, 4348 | "wires": [] 4349 | }, 4350 | { 4351 | "id": "855378e38d24f6e3", 4352 | "type": "change", 4353 | "z": "8b54ee4c.ea65c", 4354 | "g": "36d556d56b82cc52", 4355 | "name": "", 4356 | "rules": [ 4357 | { 4358 | "t": "move", 4359 | "p": "payload", 4360 | "pt": "msg", 4361 | "to": "payloadArray", 4362 | "tot": "msg" 4363 | }, 4364 | { 4365 | "t": "set", 4366 | "p": "payload.callsign", 4367 | "pt": "msg", 4368 | "to": "payloadArray[1]", 4369 | "tot": "msg" 4370 | }, 4371 | { 4372 | "t": "set", 4373 | "p": "payload.uid", 4374 | "pt": "msg", 4375 | "to": "payloadArray[2]", 4376 | "tot": "msg" 4377 | }, 4378 | { 4379 | "t": "set", 4380 | "p": "payload.Maidenhead", 4381 | "pt": "msg", 4382 | "to": "payloadArray[3]", 4383 | "tot": "msg" 4384 | }, 4385 | { 4386 | "t": "delete", 4387 | "p": "payloadArray", 4388 | "pt": "msg" 4389 | }, 4390 | { 4391 | "t": "delete", 4392 | "p": "payload_orig", 4393 | "pt": "msg" 4394 | } 4395 | ], 4396 | "action": "", 4397 | "property": "", 4398 | "from": "", 4399 | "to": "", 4400 | "reg": false, 4401 | "x": 1240, 4402 | "y": 1640, 4403 | "wires": [ 4404 | [ 4405 | "b06138e83e320d1a" 4406 | ] 4407 | ] 4408 | }, 4409 | { 4410 | "id": "b06138e83e320d1a", 4411 | "type": "function", 4412 | "z": "8b54ee4c.ea65c", 4413 | "g": "36d556d56b82cc52", 4414 | "name": "Maidenhead -> Lat, Lon", 4415 | "func": "/*\nMaidenhead Class taken from: \n https://github.com/mehmetc/Maidenhead\nAuthor: Mehmet Celik\nLicense: MIT\nCopyright: Copyright 2016 Mehmet Celik\n\nThe MIT License (MIT)\n\nCopyright (c) 2016 Mehmet Celik\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\nclass Maidenhead {\n constructor(lat, lon, precision = 5){\n this.lat = lat;\n this.lon = lon;\n this.precision = precision;\n }\n\n static valid(mlocation){\n if (typeof mlocation !== 'string') {\n return false;\n }\n\n if (mlocation.length < 2) {\n return false;\n }\n\n if ((mlocation.length % 2) !== 0) {\n return false;\n }\n\n var length = mlocation.length / 2;\n\n for (var counter=0; counter= 0 && heading <= 360){\n var compassBearings = [\n {\"label\": \"N\", \"start\": 0, \"end\": 11},\n {\"label\": \"NNE\", \"start\": 11, \"end\": 33},\n {\"label\": \"NE\", \"start\": 34, \"end\": 56},\n {\"label\": \"ENE\", \"start\": 57, \"end\": 78},\n {\"label\": \"E\", \"start\": 79, \"end\": 101},\n {\"label\": \"ESE\", \"start\": 102, \"end\": 123},\n {\"label\": \"SE\", \"start\": 124, \"end\": 146},\n {\"label\": \"SSE\", \"start\": 147, \"end\": 168},\n {\"label\": \"S\", \"start\": 169, \"end\": 191},\n {\"label\": \"SSW\", \"start\": 192, \"end\": 213},\n {\"label\": \"SW\", \"start\": 214, \"end\": 236},\n {\"label\": \"WSW\", \"start\": 237, \"end\": 258},\n {\"label\": \"W\", \"start\":\t259, \"end\": 281},\n {\"label\": \"WNW\", \"start\": 282, \"end\": 303},\n {\"label\": \"NW\", \"start\": 304, \"end\": 326},\n {\"label\": \"NNW\", \"start\": 327, \"end\": 348},\n {\"label\": \"N\", \"start\": 349, \"end\": 360}\n ];\n\n var result = compassBearings.find(function (element, index, array) {\n if (heading > element.start && heading < element.end) {\n return true;\n }\n return false;\n });\n\n return result ? result.label : '';\n }\n }\n\n _deg_to_rad(deg) {\n return deg / 180 * Math.PI;\n }\n\n _rad_to_deg(rad) {\n return rad / Math.PI * 180;\n }\n\n _pad_locator(){\n var length = this._locator.length / 2 ;\n\n while (length < 5) {\n if ((length%2) == 1) {\n this._locator += '55';\n }\n else {\n this._locator += 'LL';\n }\n\n length = this._locator.length / 2;\n }\n }\n\n _range_check(target, range, pos) {\n pos = Number(pos);\n if (pos < -range || pos > range){\n throw target + \" must be between -\" + range + \" and +\" + range;\n }\n\n return pos;\n }\n\n _convert_part_to_latlon(counter, divisor) {\n var grid_lon = this._locator.substr(counter*2, 1);\n var grid_lat = this._locator.substr(counter*2+1, 1);\n\n this._lat += this._l2n(grid_lat) * 10.0 / divisor;\n this._lon += this._l2n(grid_lon) * 20.0 / divisor;\n }\n\n _calculate_field(){\n this.__lat = (this.__lat/10) + 0.0000001;\n this.__lon = (this.__lon/20) + 0.0000001;\n this._locator += this._n2l(Math.floor(this.__lon)).toUpperCase() + this._n2l(Math.floor(this.__lat)).toUpperCase();\n this.__precision -= 1;\n }\n\n _calculate_values(){\n for (let counter=0; counter < this.__precision;counter++) {\n if((counter%2) == 0) {\n this._compute_locator(counter, 10);\n } else {\n this._compute_locator(counter, 24);\n }\n }\n }\n\n _compute_locator(counter, divisor){\n this.__lat = (this.__lat - Math.floor(this.__lat)) * divisor;\n this.__lon = (this.__lon - Math.floor(this.__lon)) * divisor;\n\n if ((counter%2) == 0) {\n this._locator += \"\" + Math.floor(this.__lon) + \"\" + Math.floor(this.__lat)\n } else {\n this._locator += this._n2l(Math.floor(this.__lon)) + this._n2l(Math.floor(this.__lat))\n }\n }\n\n _l2n(letter){\n if (letter.match(/[0-9]+/)) {\n return parseInt(letter);\n }else{\n return letter.toLowerCase().charCodeAt(0) - 97;\n }\n\n }\n _n2l(number){\n return String.fromCharCode(97 + number);\n }\n}\n\n// Extract Maidenhead & Callsign from CQ Call:\n//let splitCopy = msg.payload.copy.split(\" \")\n//msg.payload.Maidenhead = splitCopy.pop();\n//msg.payload.callsign = splitCopy.pop();\n\n// Extract Latitute & Longitude from Maidenhead:\nmsg.payload.location = Maidenhead.toLatLon(msg.payload.Maidenhead);\n\nreturn msg;\n", 4416 | "outputs": 1, 4417 | "noerr": 0, 4418 | "initialize": "", 4419 | "finalize": "", 4420 | "libs": [], 4421 | "x": 1450, 4422 | "y": 1640, 4423 | "wires": [ 4424 | [ 4425 | "c8514e2834071e93" 4426 | ] 4427 | ] 4428 | }, 4429 | { 4430 | "id": "9a8fef750361e618", 4431 | "type": "link out", 4432 | "z": "8b54ee4c.ea65c", 4433 | "g": "36d556d56b82cc52", 4434 | "name": "Position SA", 4435 | "mode": "link", 4436 | "links": [ 4437 | "520d7c534c5146c8" 4438 | ], 4439 | "x": 1875, 4440 | "y": 1640, 4441 | "wires": [] 4442 | }, 4443 | { 4444 | "id": "c8514e2834071e93", 4445 | "type": "function", 4446 | "z": "8b54ee4c.ea65c", 4447 | "g": "36d556d56b82cc52", 4448 | "name": "CoT", 4449 | "func": "const dt = Date.now();\nconst dtD = new Date(dt);\nconst dtD5 = new Date(dt + 14400000);\n\nmsg.payload = {\n \"event\": {\n \"$\": { \n \"version\":\"2.0\",\n \"type\":\"a-f-G-U\",\n \"uid\":`${msg.payload.uid}`,\n \"time\":dtD.toISOString(),\n \"start\":dtD.toISOString(),\n \"stale\":dtD5.toISOString(),\n \"how\":\"m-g\"\n\n },\n \"detail\": [\n {\n \"contact\": [\n {\n \"$\": {\n \"callsign\":`${msg.payload.callsign}`\n }\n }],\n \"link\": [\n {\n \"$\": {\n \"uid\":\"80085\",\n \"production_time\":dtD.toISOString(),\n \"type\":\"a-f-G-U-U-S-R\",\n \"parent_callsign\":\"BOBTAK\",\n \"relation\":\"p-p\"\n }\n }],\n \"precisionlocation\": [\n {\n \"$\": {\n \"geopointsrc\":\"GPS\"\n }\n }]\n }],\n \"point\": [ \n { \n \"$\": { \n \"lat\": `${msg.payload.location[0]}`, \n \"lon\": `${msg.payload.location[1]}`, \n \"hae\": \"9999999.0\", \n \"ce\": \"9999999.0\", \n \"le\": \"9999999.0\"\n }\n \n }\n ]\n }\n \n}\nreturn msg;", 4450 | "outputs": 1, 4451 | "noerr": 0, 4452 | "initialize": "", 4453 | "finalize": "", 4454 | "libs": [], 4455 | "x": 1630, 4456 | "y": 1640, 4457 | "wires": [ 4458 | [ 4459 | "14b74d085c975762" 4460 | ] 4461 | ] 4462 | }, 4463 | { 4464 | "id": "14b74d085c975762", 4465 | "type": "xml", 4466 | "z": "8b54ee4c.ea65c", 4467 | "g": "36d556d56b82cc52", 4468 | "name": "", 4469 | "property": "payload", 4470 | "attr": "", 4471 | "chr": "", 4472 | "x": 1770, 4473 | "y": 1640, 4474 | "wires": [ 4475 | [ 4476 | "9a8fef750361e618", 4477 | "820a1c9e9bb87dba" 4478 | ] 4479 | ] 4480 | }, 4481 | { 4482 | "id": "e8ca1074ada9bc07", 4483 | "type": "comment", 4484 | "z": "8b54ee4c.ea65c", 4485 | "g": "36d556d56b82cc52", 4486 | "name": "Format", 4487 | "info": "4,callsign,uid,maidenhead", 4488 | "x": 1490, 4489 | "y": 1600, 4490 | "wires": [] 4491 | }, 4492 | { 4493 | "id": "820a1c9e9bb87dba", 4494 | "type": "debug", 4495 | "z": "8b54ee4c.ea65c", 4496 | "name": "", 4497 | "active": false, 4498 | "tosidebar": true, 4499 | "console": false, 4500 | "tostatus": false, 4501 | "complete": "false", 4502 | "statusVal": "", 4503 | "statusType": "auto", 4504 | "x": 1910, 4505 | "y": 1720, 4506 | "wires": [] 4507 | } 4508 | ] -------------------------------------------------------------------------------- /Plugin/ATAK-Plugin-bobtak-1.0-1-4.10.0-civ-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sniporbob/BobTAK/1360383e37c4b85dcd112d724921004b042aa918/Plugin/ATAK-Plugin-bobtak-1.0-1-4.10.0-civ-release.apk -------------------------------------------------------------------------------- /Plugin/ATAK-Plugin-bobtak-1.0-1-4.4.0-civ-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sniporbob/BobTAK/1360383e37c4b85dcd112d724921004b042aa918/Plugin/ATAK-Plugin-bobtak-1.0-1-4.4.0-civ-release.apk -------------------------------------------------------------------------------- /Plugin/ATAK-Plugin-bobtak-1.0-1-4.5.1-civ-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sniporbob/BobTAK/1360383e37c4b85dcd112d724921004b042aa918/Plugin/ATAK-Plugin-bobtak-1.0-1-4.5.1-civ-release.apk -------------------------------------------------------------------------------- /Plugin/ATAK-Plugin-bobtak-1.0-1-4.6.1-civ-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sniporbob/BobTAK/1360383e37c4b85dcd112d724921004b042aa918/Plugin/ATAK-Plugin-bobtak-1.0-1-4.6.1-civ-release.apk -------------------------------------------------------------------------------- /Plugin/ATAK-Plugin-bobtak-1.0-1-4.9.0-civ-release.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sniporbob/BobTAK/1360383e37c4b85dcd112d724921004b042aa918/Plugin/ATAK-Plugin-bobtak-1.0-1-4.9.0-civ-release.apk -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BobTAK 2 | ATAK Plugin and Node RED flows to send data via HF radio 3 | 4 | NOTE: to use the BobTAK_GPSD flow, you will need to have installed and configured the linux GPSD service, as well as install node-red-contrib-gpsd from the palette manager in node red. 5 | --------------------------------------------------------------------------------