Skip to content
This repository was archived by the owner on Aug 27, 2022. It is now read-only.
This repository was archived by the owner on Aug 27, 2022. It is now read-only.

Rotary Encoder for Website Control #182

@DIY89

Description

@DIY89

Hi Andi,

da meine Photobox kein Touchscreen enthält würde die Website gerne mit einem Druck-Dreh-Taster bedienen wollen.
In der vorherigen Version habe ich ein Sock-Server(nodejs) eingebaut der hardwareseitig die Signale einliest und an den Client (Website) Befehle (links/rechts/gedrückt) sendet.

Die Befehle habe ich genutzt um von einem zum anderen benachtbarten Button zu springen.
Beim Aufruf der Startseite wird dem ersten Button eine zusätzlich css-class spendiert "focused".
Über den Javascript Code springe ich je nach Befehl zum $('.focused').prev('button') oder zum $('.focused').next('button')

Aktuell funktioniert die Verbindung zu dem sock-Server nicht da der Cross-Origin Zugriff nicht funktioniert.
Die Webserver Adresse steht auf Localhost (127.0.0.1). Selbt wenn ich die Website auf dem PI aufrufe klappt die Verbindung zu dem Sock-Server nicht.

`/* VARIABLES */
const myPid = process.pid;
let mTimeTrigger = 0,
collageInProgress = false;

let triggerArmed = true,
buttonIsPressed = false;

const Rotary = require('raspberrypi-rotary-encoder');

// WARNING ! This is WIRINGPI pin numerotation !! please see https://fr.pinout.xyz/pinout/wiringpi#*
const rotary = new Rotary(12, 13, 14);

/* HANDLE EXCEPTIONS */

process.on('uncaughtException', function (err) {
console.log('socket.io server [', myPid, ']: Error: ', err.message);
fs.unlink(pidFilename, function (error) {
if (error) {
console.log('socket.io server [', myPid, ']: Error deleting PID file ', error.message);
}
});
console.log('socket.io server [', myPid, ']: Exiting');

/* got to exit now and here - can not recover from error */
process.exit();

});

/* SOURCE PHOTOBOOTH CONFIG */

const {execSync} = require('child_process');
const stdout = execSync('cd api && php ./config.php').toString();
//const config = JSON.parse(stdout.slice(stdout.indexOf('{'), -1));

/* WRITE PROCESS PID FILE */

const pidFilename = config.folders.tmp + '/socket_server.pid';

const fs = require('fs');

fs.writeFile(pidFilename, myPid, function (err) {
if (err) {
throw new Error('Unable to write PID file [' + pidFilename + '] - ' + err.message);
}

console.log('socket.io server [', myPid, ']: PID file created [', pidFilename, ']');

});

/* START WEBSOCKET SERVER */

console.log(
'socket.io server [',
myPid,
']: Requested to start on http://' + config.webserver_ip + ':' + config.socket_port,
', Pin_l: ', config.pin_l,
', Pin_r: ', config.pin_r,
', Pin_b: ', config.pin_b
);

rotary.on("rotate", (delta) => {
console.log("Rotation :"+delta);
if(delta > 0){
ioServer.emit("photobooth-socket", "negative");
}else{
ioServer.emit("photobooth-socket", "positive");
}
});
rotary.on("pressed", () => {
console.log("Rotary switch pressed");
ioServer.emit("photobooth-socket", "pressed");
});
rotary.on("released", () => {
console.log("Rotary switch released");
ioServer.emit("photobooth-socket", "released");
});

const ioServer = require('socket.io')(config.socket_port, {
cors: {
origin: 'http://' + config.webserver_ip,
methods: ['GET', 'POST']
}
});

ioServer.on('connection', function (client) {
console.log('socket.io server [', myPid, ']: New client connected - ID', client.id);
client.on('photobooth-socket', function (data) {
console.log(
'socket.io server [',
myPid,
']: Data from client ID ',
client.id,
': [ photobooth-socket ] => [',
data,
']'
);

	/* Main */
	if($('#start').is(':visible')){
		// set focus if not done yet
		if(!($('.divinnen2 a').hasclass('focused'))){
			$('.divinnen2 a').first().addClass('focused');
		}
	}

	/* Result */
	if($('.resultInner').hasClass('show')){
		// set focus if not done yet
		if(!($('.resultInner a').hasclass('focused'))){
			$('.divinnen2 a').first().addClass('focused');
		}
	}

	/* Filter */
	if($('#mysidenav').hasClass('sidenav--open')){
		// set focus if not done yet
		if(!($('#mysidenav div').hasclass('focused'))){
			$('.divinnen2 div').first().addClass('focused');
		}

		if(data == "negative"){
			if($('.focused div:first').hasClass('focused')){
				$('.focused').removeClass('focused').prev().addClass('focused');
				return;
			}
		}
	}

	/* Gallery */
	if($('#gallery').hasClass('gallery--open')){
		// set focus if not done yet
		if(!($('gallery__body div').hasclass('focused')) || (!($('gallery__close').hasclass('focused')))){
			$('.gallery__body a').first().addClass('focused');
		}

		// Up
		if(data == "negative"){
			// if focus is on picture
			if($('.pswp__button.focused').nextAll('.pswp__button:visible:first').length != 0){
				$('.focused').removeClass('focused').nextAll(':visible:first').addClass('focused');
			// if focus is on close button
			}else if($('gallery__close').hasClass('focused')){
				$('.focused').removeClass('focused');
				$('.gallery__body a').first().addClass('focused');
			}
		}

		if(data == "positive"){
			// if focus is on picture
			if($('.pswp__button.focused').prevAll('.pswp__button:visible:first').length != 0){
				$('.focused').removeClass('focused').prevAll(':visible:first').addClass('focused');
			}else if($('gallery__close').hasClass('focused')){
				$('.focused').removeClass('focused');
				$('gallery__close').addClass('focused');
			}
		}
		console.log('Focuse now on: ' + $('.focused').attr('class') + ' FocusIndex: ' + $('.focused').index());
		return;
	}

	/* Photoswipe */
	if($('.pswp').hasClass('pswp--open')){
		if(data == "negative" && $('.pswp__button.focused').nextAll('.pswp__button:visible:first').length != 0){
			$('.focused').removeClass('focused').nextAll(':visible:first').addClass('focused');
		}
		if(data == "positive" && $('.pswp__button.focused').prevAll('.pswp__button:visible:first').length != 0){
			$('.focused').removeClass('focused').prevAll(':visible:first').addClass('focused');
		}
	}

	/* set focus to prev() or next() button */
	if(data == "negative"){
		$('a .focused').prev().removeClass('focused').next().addClass('focused');
	}
	if(data == "positive"){
		$('a .focused').next().removeClass('focused').prev().addClass('focused');
	}
	if(data == "pressed"){
	$('.focused').removeClsss('focused').click();
}

});

client.on('disconnect', function () {
	console.log('socket.io server [', myPid, ']: Client disconnected - ID ', client.id);

	if (ioServer.engine.clientsCount == 0) {
		console.log('socket.io server [', myPid, ']: No more clients connected - removing lock and arming trigger');
		triggerArmed = true;
		collageInProgress = false;
	}
});

});
console.log('socket.io server [', myPid, ']: socket.io server started');

`

Metadata

Metadata

Assignees

Labels

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions