This commit is contained in:
2026-06-02 16:36:54 +01:00

36
app.py
View File

@ -4,11 +4,18 @@ A simple Flask application for interacting with WHSPAH shockers.
import argparse import argparse
import logging import logging
import json
import os import os
import waitress.server import waitress.server
import flask import flask
import whspah
ACTION_MAP = {'shock': whspah.MODES.SHOCK,
'vibrate': whspah.MODES.VIBRATE,
'beep': whspah.MODES.BEEP}
app = flask.Flask(__name__, static_folder='./www/') app = flask.Flask(__name__, static_folder='./www/')
@app.route('/', defaults={'path': 'index.html'}) @app.route('/', defaults={'path': 'index.html'})
@ -23,6 +30,33 @@ def staticPage(path):
return flask.send_from_directory(app.static_folder, path) return flask.send_from_directory(app.static_folder, path)
@app.route('/transmit', methods=['POST'], strict_slashes=False)
def transmit():
"""
Transmits the data contained within the POST request through WHSPAH.
"""
data = json.loads(flask.request.data)
try:
txID = int(data['transmitterID'])
channel = int(data['channel'])
action = ACTION_MAP[data['action']]
intensity = int(data.get('intensity', 0))
lucal = bool(data.get('lucalEncoded', False))
except (ValueError, KeyError):
return {'success': False, 'message': 'Request must contain the following keys:\n'+
'txID: int,\n'+
'channel: int,\n'+
'action: "shock", "vibrate" or "beep",\n'+
'intensity (optional): int\n'+
'lucalEncoded (optional): bool'}, 400
tx: whspah.Transmitter = app.config['transmitter']
tx.transmit(txID, channel, action, intensity, lucal)
return {'success': True}, 200
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
@ -36,6 +70,8 @@ if __name__ == '__main__':
else: else:
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
app.config['transmitter'] = whspah.Transmitter()
if args.debug: if args.debug:
app.run(host=args.ip, port=args.port, debug=True) app.run(host=args.ip, port=args.port, debug=True)
else: else: