Newer
Older
stick-prototyp / menu / main.js
const
    h = 652,
    w = 412

let nfc = () => {}

const buttons = [
    { x: (w - 75) / 2, y : 350 + 60, h: 50, w: 75, callback: b => {} },
    { x: (w - 75) / 2, y : 350 + 2*60, h: 50, w: 75, callback: b => {} },
    { x: (w - 75) / 2, y : 350 + 3*60, h: 50, w: 75, callback: b => {} }
]

const body = document.getElementsByTagName('body')[0]
const textarea = document.getElementsByTagName('textarea')[0]

buttons.forEach(b => {
    const button = document.createElement('div')
    button.classList.add('button')

    button.style.height = b.h + 'px'
    button.style.width = b.w + 'px'
    button.style.top = b.y + 'px'
    button.style.left = b.x + 'px'

    // button.innerText = b.name

    body.appendChild(button)
    b.button = button

    button.addEventListener('click', () => b.callback(b))
})

const resetButtons = () => {
    buttons.forEach(b => {
        b.button.innerText = ""
        b.callback = () => {
        }
    })
}
const sleep = ms => {
    return new Promise(resolve => setTimeout(resolve, ms));
}

let room = undefined
let device = undefined

const state = newState => {
    resetButtons()
    switch (newState) {
        case 1:
            nfc = () => {}
            // Room
            device = undefined
            textarea.innerHTML = `${room.title}
Devices:
` + room.devices.map((d, i) => `${i===room.i ? ">":" "}- ${d.name}`).join("\n")

            if (room.devices.length > 0) {
                buttons[0].button.innerText = "OK"
                buttons[0].callback = b => {
                    device = room.devices[room.i]
                    state(4)
                }
            }
            if (room.devices.length > 1) {
                buttons[1].button.innerText = '\\/'
                buttons[1].callback = b => {
                    room.i = (room.i + 1) % room.devices.length
                    state(1)
                }
            }
            buttons[2].button.innerText = "<"
            buttons[2].callback = b => {
                state(3)
            }
            break;
        case 2:
            // Room_Standby
            break;
        case 3:
            // Ready
            room = undefined
            textarea.innerHTML = `Ready

Tap NFC...`

            buttons[2].button.innerText = "OFF"
            buttons[2].callback = b => {
                state(0)
            }
            nfc = id => {
                switch (id) {
                    case "4c:67:1f:31":
                        // blue
                        room = {
                            title: "Garten",
                            i: 0,
                            devices: [
                                { name: "Rasensprenger"},
                                { name: "Tor"},
                                { name: "Terassenlicht"},
                                { name: "Ambiente"}
                            ]
                        }
                        state(1)
                        break;
                    case "da:10:15:bf":
                        // card
                        room = {
                            title: "Hörsaal I012",
                            i: 0,
                            devices: [
                                { name: "Beamer"},
                                { name: "Licht vorne"},
                                { name: "Licht Raum"},
                                { name: "Soundanlage"}
                            ]
                        }
                        state(1)
                        break;
                    default:
                        textarea.innerHTML = `Ready

Tap NFC...

Unknown Card`
                        nfc = () => {}
                        sleep(1000)
                            .then(() => state(3))
                }
            }
            break;
        case 4:
            // Device
            textarea.innerHTML = `${room.title} - ${device.name}

`
            buttons[2].button.innerText = "<"
            buttons[2].callback = b => {
                state(1)
            }
            break;
        case 0:
        default:
            // Standby
            // Display aus
            textarea.innerHTML = ""

            // mqtt disconnect
            // wifi disconnect

            // nfc aus
            nfc = () => {}

            buttons[0].button.innerText = "ON"
            buttons[0].callback = b => {
                state(3)
            }
            break;
    }
}

state(0);

(async () => {
    try {
        const ndef = new NDEFReader();
        await ndef.scan();
        console.log("> Scan started");

        ndef.addEventListener("readingerror", () => {
            console.log("Argh! Cannot read data from the NFC tag. Try another one?");
        });

        ndef.addEventListener("reading", ({ message, serialNumber }) => {
            console.log(`> Serial Number: ${serialNumber}`);
            console.log(`> Records: (${message.records.length})`);

            nfc(serialNumber)
        });
    } catch (error) {
        console.log("Argh! " + error);
    }
})()