Add serial and Arduino file
This commit is contained in:
6
.vscode/settings.json
vendored
Normal file
6
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
{
|
||||
"cSpell.enabled": false,
|
||||
"files.exclude": {
|
||||
"**/.git": false
|
||||
}
|
||||
}
|
19
Dockerfile
19
Dockerfile
@ -1,19 +0,0 @@
|
||||
# Docker image for barcode-server
|
||||
|
||||
FROM python:3.9
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get -y install sudo
|
||||
RUN pip install --upgrade pip;\
|
||||
pip install pipenv;\
|
||||
pipenv install --system --deploy;\
|
||||
pip install .
|
||||
|
||||
ENV PUID=1000 PGID=1000
|
||||
|
||||
ENTRYPOINT [ "docker/entrypoint.sh", "barcode-server" ]
|
||||
CMD [ "run" ]
|
35
Makefile
35
Makefile
@ -1,35 +0,0 @@
|
||||
PROJECT=barcode_server
|
||||
|
||||
current-version:
|
||||
set -ex
|
||||
@echo "Current version is `cat ${PROJECT}/__init__.py | grep '__version__' | cut -d ' ' -f3 | sed s/\\\"//g`"
|
||||
|
||||
build:
|
||||
git stash
|
||||
python setup.py sdist
|
||||
- git stash pop
|
||||
|
||||
test:
|
||||
pipenv run pytest
|
||||
|
||||
git-release:
|
||||
set -ex
|
||||
git add ${PROJECT}/__init__.py
|
||||
git commit -m "Bumped version to `cat ${PROJECT}/__init__.py | grep '__version__' | cut -d ' ' -f3 | sed s/\\\"//g`"
|
||||
git tag v`cat ${PROJECT}/__init__.py | grep '__version__' | cut -d ' ' -f3 | sed s/\"//g`
|
||||
git push
|
||||
git push --tags
|
||||
|
||||
_release-patch:
|
||||
@echo "__version__ = \"`cat ${PROJECT}/__init__.py | awk -F '("|")' '{ print($$2)}' | awk -F. '{$$NF = $$NF + 1;} 1' | sed 's/ /./g'`\"" > ${PROJECT}/__init__.py
|
||||
release-patch: test _release-patch git-release current-version
|
||||
|
||||
_release-minor:
|
||||
@echo "__version__ = \"`cat ${PROJECT}/__init__.py | awk -F '("|")' '{ print($$2)}' | awk -F. '{$$(NF-1) = $$(NF-1) + 1;} 1' | sed 's/ /./g' | awk -F. '{$$(NF) = 0;} 1' | sed 's/ /./g' `\"" > ${PROJECT}/__init__.py
|
||||
release-minor: test _release-minor git-release current-version
|
||||
|
||||
_release-major:
|
||||
@echo "__version__ = \"`cat ${PROJECT}/__init__.py | awk -F '("|")' '{ print($$2)}' | awk -F. '{$$(NF-2) = $$(NF-2) + 1;} 1' | sed 's/ /./g' | awk -F. '{$$(NF-1) = 0;} 1' | sed 's/ /./g' | awk -F. '{$$(NF) = 0;} 1' | sed 's/ /./g' `\"" > ${PROJECT}/__init__.py
|
||||
release-major: test _release-major git-release current-version
|
||||
|
||||
release: release-patch
|
64
arduino/LiquidCrystal_I2C.ino
Normal file
64
arduino/LiquidCrystal_I2C.ino
Normal file
@ -0,0 +1,64 @@
|
||||
/**
|
||||
* Displays text sent over the serial port (e.g. from the Serial Monitor) on
|
||||
* an attached LCD.
|
||||
* https://wiki.52pi.com/index.php?title=Z-0234
|
||||
*/
|
||||
|
||||
#include <Wire.h>
|
||||
#include <LiquidCrystal_I2C.h>
|
||||
|
||||
String topLine;
|
||||
String bottomLine;
|
||||
String incomingString;
|
||||
|
||||
// Set the LCD address to 0x27 for a 16 chars and 2 line display
|
||||
LiquidCrystal_I2C lcd(0x27, 16, 2);
|
||||
|
||||
void setup()
|
||||
{
|
||||
lcd.begin();
|
||||
lcd.backlight();
|
||||
|
||||
// Initialize the serial port at a speed of 9600 baud
|
||||
Serial.begin(9600);
|
||||
}
|
||||
|
||||
void loop()
|
||||
{
|
||||
// If characters arrived over the serial port...
|
||||
if (Serial.available())
|
||||
{
|
||||
// Wait a bit for the entire message to arrive
|
||||
delay(100);
|
||||
// Clear the screen
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0);
|
||||
// Write all characters received with the serial port to the LCD.
|
||||
while (Serial.available() > 0)
|
||||
{
|
||||
incomingString = Serial.readString();
|
||||
Serial.println(incomingString);
|
||||
if (incomingString[0] != '1')
|
||||
{
|
||||
topLine = incomingString;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (incomingString != "123456" && (incomingString.length() < 2 || (incomingString[1] != 't' && incomingString[1] != 'T')))
|
||||
{
|
||||
bottomLine = "";
|
||||
}
|
||||
else
|
||||
{
|
||||
bottomLine = incomingString;
|
||||
bottomLine[0] = ' ';
|
||||
bottomLine[1] = ' ';
|
||||
}
|
||||
}
|
||||
|
||||
lcd.print(topLine);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print(bottomLine);
|
||||
}
|
||||
}
|
||||
}
|
@ -22,33 +22,38 @@ barcode_server:
|
||||
retry_interval: 2s
|
||||
|
||||
# (optional) HTTP push configuration
|
||||
http:
|
||||
serial:
|
||||
# URL to send events to using a request
|
||||
url: "http://dummy.restapiexample.com/api/v1/create"
|
||||
path: "/dev/ttyUSB0"
|
||||
|
||||
# (optional) HTTP push configuration
|
||||
# http:
|
||||
# URL to send events to using a request
|
||||
# url: "http://dummy.restapiexample.com/api/v1/create"
|
||||
# The request method to use
|
||||
method: POST
|
||||
# method: POST
|
||||
# Headers to set on each request
|
||||
headers:
|
||||
- "X-Auth-Token: MY_HEADERS"
|
||||
# headers:
|
||||
# - "X-Auth-Token: MY_HEADERS"
|
||||
|
||||
# (optional) MQTT push configuration
|
||||
mqtt:
|
||||
# mqtt:
|
||||
# MQTT server host address
|
||||
host: "mqtt.mydomain.com"
|
||||
# host: "mqtt.mydomain.com"
|
||||
# (optional) MQTT server port
|
||||
port: 1883
|
||||
# port: 1883
|
||||
# (optional) Client ID of this barcode-server instance to provide to the MQTT server
|
||||
client_id: "barcode-server"
|
||||
# client_id: "barcode-server"
|
||||
# MQTT topic to push events to
|
||||
topic: "barcode-server/barcode"
|
||||
# topic: "barcode-server/barcode"
|
||||
# Username to use when connecting to the MQTT server
|
||||
user: "myuser"
|
||||
# user: "myuser"
|
||||
# Password to use when connecting to the MQTT server
|
||||
password: "mypassword"
|
||||
# password: "mypassword"
|
||||
# (optional) QoS value of event messages
|
||||
qos: 2
|
||||
# qos: 2
|
||||
# (optional) Whether to instruct the MQTT server to remember event messages between restarts (of the MQTT server)
|
||||
retain: True
|
||||
# retain: True
|
||||
|
||||
# A list of regex patterns to match USB device names against
|
||||
devices:
|
||||
|
@ -1 +1 @@
|
||||
__version__ = "2.3.0"
|
||||
__version__ = "2.3.1"
|
||||
|
@ -213,6 +213,15 @@ class AppConfig(ConfigBase):
|
||||
required=True
|
||||
)
|
||||
|
||||
SERIAL_PATH = StringConfigEntry(
|
||||
key_path=[
|
||||
CONFIG_NODE_ROOT,
|
||||
CONFIG_NODE_SERIAL,
|
||||
"path"
|
||||
],
|
||||
required=False
|
||||
)
|
||||
|
||||
DEVICE_PATTERNS = ListConfigEntry(
|
||||
item_type=RegexConfigEntry,
|
||||
item_args={
|
||||
|
@ -22,6 +22,7 @@ CONFIG_NODE_ROOT = "barcode_server"
|
||||
CONFIG_NODE_SERVER = "server"
|
||||
CONFIG_NODE_HTTP = "http"
|
||||
CONFIG_NODE_MQTT = "mqtt"
|
||||
CONFIG_NODE_SERIAL = "serial"
|
||||
|
||||
CONFIG_NODE_STATS = "stats"
|
||||
CONFIG_NODE_PORT = "port"
|
||||
|
23
barcode_server/notifier/serial.py
Normal file
23
barcode_server/notifier/serial.py
Normal file
@ -0,0 +1,23 @@
|
||||
import serial
|
||||
import logging
|
||||
# import time as sleep
|
||||
|
||||
from prometheus_async.aio import time
|
||||
|
||||
from barcode_server.barcode import BarcodeEvent
|
||||
from barcode_server.notifier import BarcodeNotifier
|
||||
from barcode_server.stats import SERIAL_NOTIFIER_TIME
|
||||
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
|
||||
class SerialNotifier(BarcodeNotifier):
|
||||
|
||||
def __init__(self, path: str, usb: serial):
|
||||
super().__init__()
|
||||
self.path = path
|
||||
self.usb = usb
|
||||
|
||||
@time(SERIAL_NOTIFIER_TIME)
|
||||
async def _send_event(self, event: BarcodeEvent):
|
||||
self.usb.write(event.barcode.encode())
|
||||
LOGGER.debug(f"Notified {self.path}: {event.barcode}")
|
@ -25,4 +25,5 @@ REST_TIME_DEVICES = REST_TIME.labels(endpoint=ENDPOINT_DEVICES)
|
||||
NOTIFIER_TIME = Summary('notifier_processing_seconds', 'Time spent in a notifier', ['type'])
|
||||
WEBSOCKET_NOTIFIER_TIME = NOTIFIER_TIME.labels(type='websocket')
|
||||
HTTP_NOTIFIER_TIME = NOTIFIER_TIME.labels(type='http')
|
||||
SERIAL_NOTIFIER_TIME = NOTIFIER_TIME.labels(type='serial')
|
||||
MQTT_NOTIFIER_TIME = NOTIFIER_TIME.labels(type='mqtt')
|
||||
|
@ -1,3 +1,4 @@
|
||||
import serial
|
||||
import asyncio
|
||||
import logging
|
||||
from typing import Dict
|
||||
@ -13,6 +14,7 @@ from barcode_server.const import *
|
||||
from barcode_server.notifier import BarcodeNotifier
|
||||
from barcode_server.notifier.http import HttpNotifier
|
||||
from barcode_server.notifier.mqtt import MQTTNotifier
|
||||
from barcode_server.notifier.serial import SerialNotifier
|
||||
from barcode_server.notifier.ws import WebsocketNotifier
|
||||
from barcode_server.stats import REST_TIME_DEVICES, WEBSOCKET_CLIENT_COUNT
|
||||
from barcode_server.util import input_device_to_dict
|
||||
@ -33,6 +35,8 @@ class Webserver:
|
||||
self.barcode_reader = barcode_reader
|
||||
self.barcode_reader.add_listener(self.on_barcode)
|
||||
|
||||
self.usb = {}
|
||||
|
||||
self.notifiers: Dict[str, BarcodeNotifier] = {}
|
||||
if config.HTTP_URL.value is not None:
|
||||
http_notifier = HttpNotifier(
|
||||
@ -54,6 +58,11 @@ class Webserver:
|
||||
)
|
||||
self.notifiers["mqtt"] = mqtt_notifier
|
||||
|
||||
if config.SERIAL_PATH.value is not None:
|
||||
self.usb = serial.Serial(config.SERIAL_PATH.value, 9600, timeout=2)
|
||||
serial_notifier = SerialNotifier(config.SERIAL_PATH.value, self.usb)
|
||||
self.notifiers["serial"] = serial_notifier
|
||||
|
||||
async def start(self):
|
||||
# start detecting and reading barcode scanners
|
||||
await self.barcode_reader.start()
|
||||
|
@ -1,4 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
sudo -E -u "#${PUID}" -g "#${PGID}" "$@"
|
Reference in New Issue
Block a user