# Table Soccer Replay

<abstract>
Sistema di conteggio punti e replay video su biliardino tradizionale
</abstract>

Le Raspberry usate sono due con nome host:

* bluereplay.local
* redreplay.local

Sono le manopole installate vicino al portiere della squadra blue e il portiere della squadra rossa

Sono realizzate con:

* Raspberry Pi 3 A+
* Una Raspicam versione 1.3
* Tre pulsanti (Bianco, Nero e Giallo)
* Un encoder rotativo meccanico [KY-040](/rotary_encoder)

Su queste schede girano due programmi Python lanciati automaticamente allo startup:

### replay.py

Questo programma registra il video dalla Raspicam memorizzandolo su un buffer circolare
di qualche secondo.

Quando arriva un messaggio MQTT qualsiasi sul server bscreen.local topic table_soccer/bluereplay/cmd
salva il video nel file /home/pi/camera/video/nomedinamico.mp4 che è raggiungibile su rete via apache2
e invia un messaggio MQTT topic table_soccer/bluereplay/ready con il nome del file generato

### rotary.py

Questo programma legge lo stato della manopola e dei pulsanti e genera i seguenti eventi MQTT sul 
server bscreen.local topic table_soccer/bluereplay/input

* "left" manopola girata sinistra di un passo 
* "right" manopola girata a destra di un passo 
* "0" manopola premuta
* "1" tasto bianco premuto
* "2" tasto nero premuto
* "3" tasto giallo premuto

Su bluereplay.local è installato anche il server mqtt mosquitto

## Installazione software su bluereplay e redreplay

Lanciare

	sudo raspi-config
	
e abilitare la picamera, cambiare l'hostname in redcam o bluecam e settare l'orario su Roma	

Installare i pacchetti Debian richiesti:
	
	sudo apt update
	sudo apt -y install ffmpeg python3-pip python3-picamera python3-evdev apache2 git
	sudo pip3 install paho-mqtt
	
	cd
	git clone https://github.com/tanzilli/table_soccer_replay.git

Creare i file di lancio allo startup con nano:

	sudo nano /lib/systemd/system/replay.service

con il seguente contenuto:

	[Unit]
	Description=Replay camera
	After=systemd-user-sessions.service
	
	[Service]
	ExecStart=python3 replay.py
	Restart=on-abort
	User=pi
	WorkingDirectory=/home/pi/table_soccer_replay
	
	[Install]
	WantedBy=multi-user.target

e

	sudo nano /lib/systemd/system/rotary.service

con il seguente contenuto:

	[Unit]
	Description=Rotary and buttons reader
	After=systemd-user-sessions.service
	
	[Service]
	ExecStart=python3 rotary.py
	Restart=on-abort
	User=pi
	WorkingDirectory=/home/pi/table_soccer_replay
	
	[Install]
	WantedBy=multi-user.target

Abilitarli ad essere lanciati in automatico da systemd con i seguenti comandi:

	sudo systemctl daemon-reload
	sudo systemctl enable replay.service 	
	sudo systemctl enable rotary.service 	

Creare una directory di lavoro su RAM dove memorizzare i video:

	sudo nano /etc/fstab

Aggiungere la linea:

	tmpfs   /home/pi/table_soccer_replay/video   tmpfs   defaults,nosuid,auto,uid=1000,size=100m  0  0

### Configurazione Apache2

Cancellare la directory di default della DocumentRoot di Apache2

	sudo rm -r /var/www/html
	
Creare un link simbolico alle pagine web dell'applicazione

	sudo ln -s /home/pi/table_soccer_replay /var/www/html

### Installazione Node-RED

Digitare:

	bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
	sudo systemctl enable nodered.service
	sudo systemctl start nodered.service

Per accedere:

* <a href="http://redcam.local:1880" target="_blank">http://redcam.local:1880</a>

## Buttons and rotary encoder wirings

|        |        |           |
|--------|--------|-----------|
| Bianco | GPIO2  | Score++   |
| Nero   | GPIO3  | Score--   |
| Giallo | GPIO4  | Undefined |
| CLK    | GPIO23 |           |
| DT     | GPIO24 |           |
| SW     | GPIO22 | Replay    |

## Activate the Linux Kernel Drivers for rotary encoder

Insert these two lines inside the /boot/config.txt file and reboot to activate the Kernel driver

	dtoverlay=rotary-encoder,pin_a=23,pin_b=24,relative_axis=1
	dtoverlay=gpio-key,gpio=22,keycode=207,label="PLAY"
	dtoverlay=gpio-key,gpio=2,keycode=59,label="KEY_F1"
	dtoverlay=gpio-key,gpio=3,keycode=60,label="KEY_F2"
	dtoverlay=gpio-key,gpio=4,keycode=61,label="KEY_F3"

<img src="https://www.raspberrypi.com/documentation/computers/images/GPIO-Pinout-Diagram-2.png" width="60%">


## Solo su bluereplay.local installare mosquitto

	sudo apt update
	sudo apt -y install mosquitto 

Configurazione:

	sudo nano /etc/mosquitto/conf.d/table_soccer_replay.conf

Contenuti:

	listener 1883
	protocol mqtt
	listener 1884
	protocol websockets

Per rilanciare il servizio:

	sudo service mosquitto restart



## Link utili

* Vecchia versione di questo articolo <https://tanzolab.tanzilli.com/replay>
* Repository GitHub <https://github.com/tanzilli/table_soccer_replay>
* [Recording to a circular stream](https://picamera.readthedocs.io/en/release-1.13/recipes1.html#recording-to-a-circular-stream)
* [Picamera Basic Recipes](https://picamera.readthedocs.io/en/release-1.13/recipes1.html)
* <https://github.com/tanzilli/raspberrypi_camera_streamer>

### Note

Conversione h264 in mp4

	ffmpeg -f h264 -i replay_redcam.h264 -c:v copy -y replay_redcam.mp4


	
