🔥 OLD BUT GOLD
🚚 Shipping from 12 USD
💰 DEALS OF THE DAY

Keyboard Custom

About

The Custom Keyboard is our Jolly Joker. By default, it enters the keywords of the WikiTest (by Marc Kerstein), however you can assign any key press to the buttons. The backspace key is smart, if you enter a whole word with one press, backspace will delete all the letters.

The code:

				
					let separatorAfter, separatorTimeout, separatorLength = 1;
let submitAfter, submitTimeout, screenTimeout;

let lastCharLength = 0;
let lastAutoSeparator = false;

let actualValue = '';

function main() {
    const separator = config.get('keyboard.separator.key');
    if (strCharAt(separator, 1) !== '#') separatorLength = strLen(separator);
    
    separatorAfter = config.get('keyboard.separator.after');
    submitAfter = config.get('keyboard.submit.after')

    ps.connect();
    resetValue();
}

function resetValue() {
    actualValue = '';
}

function peekValue() {
    ps.print(actualValue);
    clearTimeout(screenTimeout);
    setTimeout(() => {
        ps.print('');
    }, 5000);
}

function sendSeparator(charLength) {
    keyboard.send('#SEPARATOR');
    resetValue();
    lastCharLength = separatorLength + charLength;
    actualValue = '';
}

function sendSubmit() {
    if (lastAutoSeparator) {
        for (let i = 0; i < separatorLength; i++) {
            keyboard.send('#BS');
        }
    }
    keyboard.send('#SUBMIT');
    lastCharLength = 1;
    actualValue = '';
    atom.vibrate('.');
}

function handleAfter() {
    peekValue();
    
    lastAutoSeparator = false;
    if (separatorAfter > 0) {
        if (separatorAfter < 99) { // after x character
            if (strLen(actualValue) >= separatorAfter) {
                lastAutoSeparator = true;
                sendSeparator(lastCharLength);
            }
        } else {
            clearTimeout(separatorTimeout);
            separatorTimeout = setTimeout(() => {
                lastAutoSeparator = true;
                sendSeparator(lastCharLength);
            }, separatorAfter);
        }
    }
    if (submitAfter > 0) {
        if (separatorAfter < 99) { // after x character
            clearTimeout(submitTimeout);
        }
    }
}

function handleKey(key) {
    if (keyboard.isSubmit(key)) {
        return sendSubmit();
    }

    if (keyboard.isCharacter(key)) {
        keyboard.send(key);
        lastCharLength = strLen(key);
        actualValue += key;
        return handleAfter();
    }

    if (keyboard.isBackspace(key)) {
        for (let i = 0; i < lastCharLength; i++) {
            keyboard.send(key);
            actualValue = strSub(actualValue, 0, -1);
        }
        lastCharLength = 1;
        return handleAfter();
    }

    if (keyboard.isSeparator(key)) {
        sendSeparator(0);
        return handleAfter();
    }
}

function onEvent(e) {
    if (e.source !== 'atom:button') return;

    const key = config.get(`keyboard.custom.${e.value}`);
    if (e.type === 'click') return handleKey(key);

    if (!keyboard.isBackspace(key)) return;
    if (e.type === 'longpress' || e.type === 'repeatpress') return handleKey(key);
    if (strSub(e.type, 0, 5) === 'click' && strLen(e.type) === 6) {
        const clickCount = parseInt(strCharAt(e.type, 5));
        for (let i = 0; i < clickCount; i++) handleKey(key);
    }
}
				
			

Devices & MagiScript

⚛️ Atom Remote

🔢 Quantum

🤹‍♂️ MagiScript Language

🤹‍♂️ MagiScript Examples

🤹‍♂️ MagiScript Tutorials

General

📃 Examples

Atom

📃 Atom Time

🎞️ Time Practice

📃 Atom Pi (Pi Revelations)

📃 Atom Drum

🎞️ Atom Stack

📃 Atom Square

📃 Atom Level

📃 Atom THMPR

📃 Poker Hands

📃 Keyboard Numeric

📃 Keyboard NOKIA

📃 Keyboard Cursor

📃 Keyboard Media

📃 Keyboard Custom