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');
`
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.$('.focused').prev('button') oder zum $ ('.focused').next('button')
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
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');
});
/* 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);
}
});
/* 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,
']'
);
});
});
console.log('socket.io server [', myPid, ']: socket.io server started');
`