forked from Spartronics4915/2017-Dashboard
/
DashboardServer.py
101 lines (76 loc) · 3.32 KB
/
DashboardServer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env python
'''
This is our dashboard server application, using the tornado handlers,
that you can use to connect your HTML/Javascript dashboard code to
your robot via NetworkTables.
Run this application with python, then you can open your browser to
http://localhost:5080/ to view the index.html page.
'''
from os.path import abspath, dirname, exists, join
from optparse import OptionParser
import tornado.web
from tornado.ioloop import IOLoop
from networktables import NetworkTable
import pynetworktables2js
import pylib.Robotlog as Robotlog
import functools
import logging
logger = logging.getLogger('dashboard')
def initNetworktables(options):
if options.dashboard:
logger.info("Connecting to networktables in Dashboard mode")
NetworkTable.setDashboardMode()
else:
logger.info("Connecting to networktables at %s", options.robot)
NetworkTable.setIPAddress(options.robot)
NetworkTable.setClientMode()
NetworkTable.initialize()
logger.info("Networktables Initialized")
if __name__ == '__main__':
# Setup options here
parser = OptionParser()
parser.add_option('-p', '--port', default=5080,
help='Port to run web server on')
parser.add_option('-v', '--verbose', default=False, action='store_true',
help='Enable verbose logging')
parser.add_option('--robot', default='10.49.15.2',
help="Robot's IP address")
parser.add_option('--dashboard', default=False, action='store_true',
help='Use this instead of --robot to receive the IP from the driver station. WARNING: It will not work if you are not on the same host as the DS!')
options, args = parser.parse_args()
# Setup logging
log_datefmt = "%H:%M:%S"
#log_format = "%(asctime)s:%(msecs)03d %(levelname)-6s: %(name)-8s: %(message)s"
log_format = "%(asctime)s %(levelname)-6s: %(name)-8s: %(message)s"
logging.basicConfig(datefmt=log_datefmt,
format=log_format,
level=logging.DEBUG if options.verbose else logging.INFO)
if options.dashboard and options.robot != '10.49.15.2':
parser.error("Cannot specify --robot and --dashboard")
initNetworktables(options)
robotlog = Robotlog.Robotlog()
# setup tornado application with static handler + networktables support
www_dir = abspath(join(dirname(__file__), 'www'))
index_html = join(www_dir, 'index.html')
if not exists(www_dir):
logger.error("Directory '%s' does not exist!", www_dir)
exit(1)
if not exists(index_html):
logger.warn("%s not found" % index_html)
app = tornado.web.Application(
pynetworktables2js.get_handlers() +
robotlog.getHandlers() + [
(r"/()", pynetworktables2js.NonCachingStaticFileHandler,
{"path": index_html}),
(r"/(.*)", pynetworktables2js.NonCachingStaticFileHandler,
{"path": www_dir})
]
)
# Start the app
logger.info("Listening on http://localhost:%s/", options.port)
app.listen(options.port)
ioLoop = tornado.ioloop.IOLoop.current()
sock = robotlog.getUDPSocket()
callback = functools.partial(robotlog.handleMsg, sock);
ioLoop.add_handler(sock.fileno(), callback, ioLoop.READ)
IOLoop.current().start()