Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion MAVProxy/mavproxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -1202,7 +1202,7 @@ def set_mav_version(mav10, mav20, autoProtocol, mavversionArg):
parser.add_option("--profile", action='store_true', help="run the Yappi python profiler")
parser.add_option("--state-basedir", default=None, help="base directory for logs and aircraft directories")
parser.add_option("--version", action='store_true', help="version information")
parser.add_option("--default-modules", default="log,signing,wp,rally,fence,ftp,param,relay,tuneopt,arm,mode,calibration,rc,auxopt,misc,cmdlong,battery,terrain,output,adsb,layout", help='default module list')
parser.add_option("--default-modules", default="log,signing,wp,rally,fence,ftp,param,relay,tuneopt,arm,mode,calibration,rc,auxopt,misc,cmdlong,battery,terrain,output,adsb,layout,webserver", help='default module list')

(opts, args) = parser.parse_args()
if len(args) != 0:
Expand Down
65 changes: 65 additions & 0 deletions MAVProxy/modules/mavproxy_webserver/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"""
Server for serving data to the frontend GCS. Websocket communication to send
telemetry data and support different routes.
"""
import asyncio
import websockets
from threading import Thread
import time
import json
from collections import namedtuple

from MAVProxy.modules.lib import mp_module

messages = []

async def producer_handler(websocket, path):
print("Initiated Websocket Connection.")
while True:
try:
if len(messages) > 0:
message = messages.pop()
await websocket.send(json.dumps(message))
except:
print("Closed Websocket Connection.")
break

def start_loop(loop, server):
loop.run_until_complete(server)
loop.run_forever()

class WebServerModule(mp_module.MPModule):
def __init__(self, mpstate):
super(WebServerModule, self).__init__(mpstate, "webserver")
self.mpstate = mpstate

self.GPS_INT = namedtuple('GlobalPositionInt', ['time', 'rel_alt', 'asl_alt', 'lat', 'lon', 'heading', 'groundvx', 'groundvy', 'groundvz'])
self.global_position_int = self.GPS_INT(0, 0, 0, 0, 0, 0, 0, 0, 0)

new_loop = asyncio.new_event_loop()
start_server = websockets.serve(producer_handler, "localhost", 5000 ,loop=new_loop)
t = Thread(target=start_loop, args=(new_loop, start_server))
t.start()

def handle_gps_int(self, msg):
self.global_position_int = self.GPS_INT(
int(time.time()), # seconds
float(msg.relative_alt) / 1000, # meters
float(msg.alt) / 1000, # meters
float(msg.lat) / pow(10, 7), # decimal
float(msg.lon) / pow(10, 7), # decimal
msg.hdg / float(100), # degrees
msg.vx / float(100), # m/s
msg.vy / float(100), # m/s
msg.vz / float(100) # m/s
)
messages.append({"gps": self.global_position_int._asdict()})

def mavlink_packet(self, msg):
msgt = msg.get_type()
if msgt == "GLOBAL_POSITION_INT":
self.handle_gps_int(msg)


def init(mpstate):
return WebServerModule(mpstate)
Loading