Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simple state server #85

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
22 changes: 22 additions & 0 deletions apps/adsb.kml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.2">
<Folder>
<name>Network Links</name>
<visibility>1</visibility>
<open>0</open>
<description>Network link example</description>
<NetworkLink>
<name>Planes</name>
<visibility>1</visibility>
<open>0</open>
<description>Moar Planes</description>
<refreshVisibility>1</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href><![CDATA[http://localhost:8080]]></href>
<refreshMode>onInterval</refreshMode>
<refreshInterval>0.4</refreshInterval>
</Link>
</NetworkLink>
</Folder>
</kml>
127 changes: 127 additions & 0 deletions apps/adsb_to_kml.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
#!/usr/bin/env python

from twisted.internet.protocol import Protocol, ReconnectingClientFactory
from twisted.internet import reactor, task
import struct

from datetime import datetime
import calendar
import time

class Echo(Protocol):
def __init__(self):
self.buf = ""
self.targets = {}
self.timeout = task.LoopingCall(self.cull)
self.timeout.start(30)

def dataReceived(self, data):
self.buf += data
self.process()

def process(self):
while len(self.buf) >= 40:
(icao, _type, ts, lat, lon, alt) = struct.unpack("!IIdddd", self.buf[:40])
self.buf = self.buf[40:]

if _type != 0x1:
continue

self.targets[icao] = (ts, lat, lon, alt)

def get_targets(self):
return self.targets

def cull(self):
"""
Periodically this should be called to dump targets which haven't been
heard from in a while.
"""
delete_icaos = []
for icao, met in self.targets.iteritems():
print met[0]
#if (calendar.timegm(datetime.utcnow().utctimetuple()) - met[0]) > 120:
if (time.time() - met[0]) > 120:
delete_icaos.append(icao)

for i in delete_icaos:
print "deleting", i
del self.targets[i]


class EchoClientFactory(ReconnectingClientFactory):
def __init__(self):
self.connected = False

def startedConnecting(self, connector):
print 'Started to connect.'

def buildProtocol(self, addr):
print 'Connected.'
self.connected = True
self.client = Echo()
return self.client

def is_connected(self):
return self.connected

def get_client(self):
return self.client

def clientConnectionLost(self, connector, reason):
self.connected = False
print 'Lost connection. Reason:', reason
self.retry(connector)

def clientConnectionFailed(self, connector, reason):
self.connected = False
print 'Connection failed. Reason:', reason
self.retry(connector)

from twisted.web import server, resource
from lxml import etree
from pykml.factory import KML_ElementMaker as KML

class Simple(resource.Resource):

def __init__(self, _factory):
self.factory = _factory

isLeaf = True
def render_GET(self, request):
if not self.factory.is_connected():
return

request.responseHeaders.setRawHeaders("content-type", ['application/vnd.google-earth.kml+xml'])

doc = KML.kml()
folder = KML.Folder(KML.name("planes"))
doc.append(folder)
targ = self.factory.get_client().get_targets()
for icao, met in targ.iteritems():
folder.append(
KML.Placemark(
KML.name('%x' % icao),
#KML.styleUrl("#pushpin"),
KML.Point(
KML.extrude(True),
KML.altitudeMode('relativeToGround'),
KML.coordinates('%f,%f,%f' % (met[2], met[1], met[3])),
),
),
)
return etree.tostring(etree.ElementTree(doc),pretty_print=True)



if __name__ == "__main__":
host = "localhost"
port = 1234
factory = EchoClientFactory()
reactor.connectTCP(host, port, factory)

site = server.Site(Simple(factory))
reactor.listenTCP(8080, site)

reactor.run()

6 changes: 6 additions & 0 deletions apps/modes_rx
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ def main():
#output plugins
optparser.add_option("-K","--kml", type="string", default=None,
help="filename for Google Earth KML output")
optparser.add_option("-S","--state", type="int", default=None,
help="The port number to use for simple state output.")
optparser.add_option("-P","--sbs1", action="store_true", default=False,
help="open an SBS-1-compatible server on port 30003")
optparser.add_option("-m","--multiplayer", type="string", default=None,
Expand Down Expand Up @@ -75,6 +77,10 @@ def main():
sqldb = air_modes.output_sql(cpr_dec, dbname, lock, publisher) #input into the db
kmlgen = air_modes.output_kml(options.kml, dbname, my_position, lock) #create a KML generating thread to read from the db

if options.state is not None:
state_port = options.state
state = air_modes.output_state(cpr_dec, state_port, publisher)

if options.no_print is not True:
printer = air_modes.output_print(cpr_dec, publisher)

Expand Down
1 change: 1 addition & 0 deletions python/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ GR_PYTHON_INSTALL(
altitude.py
az_map.py
cpr.py
state.py
html_template.py
mlat.py
exceptions.py
Expand Down
1 change: 1 addition & 0 deletions python/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
from msprint import output_print
from sql import output_sql
from sbs1 import output_sbs1
from state import output_state
from kml import output_kml, output_jsonp
from raw_server import raw_server
from radio import modes_radio
Expand Down