import { UartService } from "microbit-web-bluetooth/types/services/uart";
const SEND_LIMIT_BYTE = 20;
const DRIVE_MIN_VALUE = 0;
const DRIVE_MAX_VALUE = 255;
const DRIVES = {
STOP: "ST",
FORWARD: "FW",
BACKWARD: "BW",
LEFT: "L",
RIGHT: "R",
NE: "NE",
SE: "SE",
SW: "SW",
NW: "NW",
CW: "CW",
CCW: "CC",
ARM: "AM",
DISARM: "DA",
ROLL: "RL",
PITCH: "PT",
YAW: "YW",
};
const ACTIONS = {
CATCH_UNIT: "CT",
CRANE: "CR",
};
const DRIVE_KEYCODES = [38, 40, 37, 39, 90, 88];
const ALLOWED_KEYCODES = [38, 40, 37, 39, 90, 88, 65, 83];
let _sendPending = false;
const _controlKey = new Map();
export const microbitControl = async (
keyValue: any,
uartService: UartService,
deviceId: string
) => {
const _uartService = uartService;
console.log("-----deviceId:", deviceId);
const sendCommand = async (command: string) => {
try {
if (_uartService) {
if (command) {
if (_sendPending === false) {
_sendPending = true;
_uartService.sendText(`${command}$`);
console.log("command", command.split(",")[0]);
_sendPending = false;
}
}
}
} catch (error) {
console.log("-----sendCommand exception:", error);
}
};
const sendCommandData = async (eventName: string, keyCode: number) => {
console.log(`-----keyEvent, keyCode:${eventName}, ${keyCode}`);
let command = "";
let key = "";
try {
if (eventName === "keydown") {
if (keyCode == 38) {
key = DRIVES.FORWARD;
} else if (keyCode === 40) {
key = DRIVES.BACKWARD;
} else if (keyCode === 37) {
key = DRIVES.CCW;
} else if (keyCode === 39) {
key = DRIVES.CW;
} else if (keyCode === 90) {
key = DRIVES.LEFT;
} else if (keyCode === 88) {
key = DRIVES.RIGHT;
} else if (keyCode === 65) {
key = ACTIONS.CATCH_UNIT;
} else if (keyCode === 83) {
key = ACTIONS.CRANE;
}
if (key) {
command = `${key},${DRIVE_MAX_VALUE}`;
}
} else if (eventName === "keyup") {
command = `${DRIVES.STOP},1`;
console.log(`-----stop 전송`);
}
if (command) sendCommand(command);
} catch (error) {
console.log("-----sendCommandData exception:", error);
}
};
const isDriveKeyCode = (keyCode: number) => {
let existKeyCode = false;
console.log("-----find keyCode:", keyCode);
for (const index in DRIVE_KEYCODES) {
const kc = DRIVE_KEYCODES[index];
console.log("-----kc:", kc);
if (kc == keyCode) {
existKeyCode = true;
break;
}
}
console.log("-----existKeyCode:", existKeyCode);
return existKeyCode;
};
const isAllowedKeyCode = (keyCode: number) => {
let existKeyCode = false;
console.log("-----find keyCode:", keyCode);
for (const index in ALLOWED_KEYCODES) {
const kc = ALLOWED_KEYCODES[index];
console.log("-----kc:", kc);
if (kc == keyCode) {
existKeyCode = true;
break;
}
}
console.log("-----existKeyCode:", existKeyCode);
return existKeyCode;
};
if (keyValue.key === "keyup") {
if (_controlKey.get(deviceId))
_controlKey.get(deviceId)["prevKeyCode"] = null;
else _controlKey.set(deviceId, { prevKeyCode: null });
console.log("microbitControl", keyValue);
if (isDriveKeyCode(keyValue.keyCode)) {
if (
_controlKey.get(deviceId)["moveKeyCode"] != null &&
_controlKey.get(deviceId)["moveKeyCode"] != undefined
) {
if (keyValue.keyCode == 38 || keyValue.keyCode == 40) {
if (_controlKey.get(deviceId))
_controlKey.get(deviceId)["moveKeyCode"] = null;
else _controlKey.set(deviceId, { moveKeyCode: null });
sendCommandData(keyValue.key, keyValue.keyCode);
if (_controlKey.get(deviceId))
_controlKey.get(deviceId)["prevKeyCode"] = null;
else _controlKey.set(deviceId, { prevKeyCode: null });
} else {
sendCommandData("keydown", _controlKey.get(deviceId)["moveKeyCode"]);
}
} else {
sendCommandData(keyValue.key, keyValue.keyCode);
if (_controlKey.get(deviceId))
_controlKey.get(deviceId)["prevKeyCode"] = null;
else _controlKey.set(deviceId, { prevKeyCode: null });
}
}
}
if (keyValue.key === "keydown") {
if (keyValue.keyCode == 38 || keyValue.keyCode == 40) {
if (_controlKey.get(deviceId))
_controlKey.get(deviceId)["moveKeyCode"] = keyValue.keyCode;
else _controlKey.set(deviceId, { moveKeyCode: keyValue.keyCode });
sendCommandData(keyValue.key, keyValue.keyCode);
}
if (
_controlKey.get(deviceId)["prevKeyCode"] != null &&
_controlKey.get(deviceId)["prevKeyCode"] != undefined
) {
if (_controlKey.get(deviceId)["prevKeyCode"] == keyValue.keyCode) {
} else {
if (_controlKey.get(deviceId))
_controlKey.get(deviceId)["prevKeyCode"] = keyValue.keyCode;
else _controlKey.set(deviceId, { prevKeyCode: keyValue.keyCode });
sendCommandData(keyValue.key, keyValue.keyCode);
}
} else {
if (_controlKey.get(deviceId))
_controlKey.get(deviceId)["prevKeyCode"] = keyValue.keyCode;
else _controlKey.set(deviceId, { prevKeyCode: keyValue.keyCode });
sendCommandData(keyValue.key, keyValue.keyCode);
}
}
};
export const robercControl = (
keyValue: any,
characteristics: BluetoothRemoteGATTCharacteristic
) => {
const sendMotionData = (eventName: string, keyCode: any) => {
console.log(`-----keyCode:${eventName}, ${keyCode}`);
const commonValue = 20;
if (characteristics) {
const encoder = new TextEncoder();
let value;
if (eventName === "keydown") {
if (keyCode == 38) {
value = { motion: { key: "forward", value: commonValue } };
} else if (keyCode === 40) {
value = { motion: { key: "back", value: commonValue } };
} else if (keyCode === 37) {
value = { motion: { key: "left", value: commonValue } };
} else if (keyCode === 39) {
value = { motion: { key: "right", value: commonValue } };
} else if (keyCode === 90) {
value = { motion: { key: "cw", value: commonValue } };
} else if (keyCode === 88) {
value = { motion: { key: "ccw", value: commonValue } };
}
} else if (eventName === "keyup") {
value = { motion: { key: "stop", value: commonValue } };
}
if (value)
characteristics.writeValue(encoder.encode(JSON.stringify(value)));
}
};
const sendCatchUnitData = (eventName: string, keyCode: any) => {
console.log(`-----keyCode:${eventName}, ${keyCode}`);
const commonValue = 20;
if (characteristics) {
const encoder = new TextEncoder();
let value;
if (eventName === "keydown") {
if (keyCode === 65) {
value = { motion: { key: "catch", value: commonValue } };
}
}
if (value)
characteristics.writeValue(encoder.encode(JSON.stringify(value)));
}
};
if (keyValue.key === "keyup") {
console.log("robercControl: ", keyValue, characteristics);
sendMotionData("keyup", keyValue.keyCode);
}
if (keyValue.key === "keydown") {
if (keyValue.keyCode === 65) {
sendCatchUnitData("keydown", keyValue.keyCode);
} else {
sendMotionData("keydown", keyValue.keyCode);
}
}
};
export const deviceTest = (uartService: any, EndTest: Function) => {
let timer: ReturnType<typeof setInterval>;
const keyValue = {
key: "keydown",
keyCode: 38,
};
let timerL = 0;
const deviceId = "test";
const stop = () => {
keyValue.key = "keyup";
microbitControl(keyValue, uartService, deviceId);
};
try {
if (uartService) {
microbitControl(keyValue, uartService, deviceId);
timer = setInterval(() => {
timerL++;
if (timerL === 1) {
stop();
keyValue.key = "keydown";
keyValue.keyCode = 40;
microbitControl(keyValue, uartService, deviceId);
}
if (timerL === 2) {
stop();
keyValue.key = "keydown";
keyValue.keyCode = 39;
microbitControl(keyValue, uartService, deviceId);
}
if (timerL === 3) {
stop();
keyValue.key = "keydown";
keyValue.keyCode = 90;
microbitControl(keyValue, uartService, deviceId);
}
if (timerL === 4) {
stop();
clearInterval(timer);
EndTest();
}
}, 1000);
}
} catch (err) {
console.log("deviceTest Error : ", err);
}
};