Testing joystick variant

master
hopkira 2020-06-01 19:36:21 +01:00
parent c08303390a
commit 07310e3536
2 changed files with 287 additions and 287 deletions

View File

@ -19,18 +19,18 @@ bottom_btn = false;
msgNum = 0; // message number msgNum = 0; // message number
NRF.setConnectionInterval(100);
Bangle.loadWidgets();
Bangle.drawWidgets();
/* /*
CONFIGURATION AREA - STATE VARIABLES CONFIGURATION AREA - STATE VARIABLES
declare global variables for the toggle button declare global variables for the toggle button
statuses; if you add an additional toggle button statuses; if you add an additional toggle button
you should declare it and initiase it here */ you should declare it and initiase it here */
var status_auto = {value: false}; var status_spk = {value: true};
var status_chess = {value: false}; var status_face = {value: true};
var status_wake = {value: false}; var status_iris_light = {value: false};
var status_iris = {value: false};
var status_hover = {value: false};
var status_dome = {value: false};
/* trsnsmit message /* trsnsmit message
where where
@ -69,49 +69,21 @@ Add an additional element to the icons array
with a unique name and the data from the Image Object with a unique name and the data from the Image Object
*/ */
const icons = [ const icons = [
{
name: "walk",
data: "gEBAP4B/ALyh7b/YALHfY9tACY55HfYdNHto7pHpIbXbL5fXAD6VlHuYAjHf47/Hf47tHK47LDa45zHc4NHHeILJHeonTO9o9rHf47/eOoB/ANg="
},
{
name: "sit",
data: "gEBAP4B/AP4BacO4ANHPI/rACp1/Hf49rGtI5/He7n3ACY55HcYAZHf45/Hf45rHe4XHGbI7/Va47zZZrpbHfbtXD5Y/vHcYB/AP4BmA"
},
{
name: "joystick",
data: "gEBAP4B/AP4BMavIALHPI9vHf47/eP45vHpY5xHo451Hf47/FuYAHHNItHABa33AP6xpAD455HqY7/Hf47/Hd49pHKIB/AP4B/AMwA=="
},
{
name: "left",
data: "gEBAP4B/AP4BKa9ojHAC5pfHJKDTUsYdZHb6ZfO+I9dABabdLbIBdHf473PP47NJdY7/ePIB/RJop5Ys7t/AP6PvD7o7fP8Y1zTZoHPf/4B/AP4B+A=="
},
{
name: "right",
data: "gEBAP4B/AP4BKa+oAXDo45hCaqFbUbLBfbbo7bHMojTR7Y5LHa51ZALo75Ov47/FeY77AP4B5WdbF3dv4B/R94fdHb5/jGuabNA57//AP4B/APw="
},
{
name: "forward",
data: "gEBAP4B/AKSX5avIALHPI9tACY55HsoAbHPI9fHfZFVGMo7/Hf47/Hf47/Hf47/Hf47/Hf47/Hf47/Hf49XHOIB/ALw="
},
{
name: "backward",
data: "gEBAP4B/AKCZ5a/Y7/Hf47/Hf47/Hf47/Hf47/Hf47/Hf47/HfIAfHf491W/L15HMo9THNI9PHNo9LHOI9HHOoB/ALg="
},
{ {
name: "back", name: "back",
data: "gEBAP4B/AP4B/AKgADHPI71HP45/HP45/HP45/HP45/Hf49/Hv49/Hv49/Hv49/Hv497He4B/AP4B/AJAA==" data: "gEBAP4B/AP4B/AKgADHPI71HP45/HP45/HP45/HP45/Hf49/Hv49/Hv49/Hv49/Hv497He4B/AP4B/AJAA=="
}, },
{ {
name: "mic_on", name: "spk_on",
data: "gEBAP4B/AKCZ5a/Y7/Hf47/Hf47/Hf47/GbY7TIcY7/Hf47/Hf47/HdY9NCpp5lCb57fOdYvNeJo91HNrlvHf7tVIdY77AP4BiA=" data: "gEBAP4B/AP4Bic/YAFPP4v1HrYZRVJo7ZDKp5jMJYvZHaYAHVL4LHACZrhADLBTJKI7dPLI7/Hf47/HeZBVFqZHZRJp1lAJ47LOtZTnHbIZDKLpHNAL69ZANp1tQbY5/AP4B/ANQ"
},
{
name: "spk_off",
data: "gEBAPhB7P/o9rFKI9pFKY9tXNYZNHrZXfMaoAHPOZhNF7LdXHpKpZEJpvPDZK1ZAB49NPLo9jHdI9NHd49PHebvxEJY9NI6I7dHpaDXcKqfPHLKjZHcpTjHbIZDKa73JHa4BXGY45xe5Y7zV+o9/Hv49JHe4BEA="
}, },
{ {
name: "comms", name: "facerecog",
data: "gEBAP4B+QvbF7ABo7/He49tACI7/Hf47zHtI7jJq47lRqoAVEqY7nHsoAZGJo71HrKxfQaY7bdKo7/Hdqz5B5Y7zHK47RD55FRHao3XHKo7JG7L1NHeJTbHboB/AP4BG" data: "gEBAP4BSLuozNH9YpTHsolXPsYfdDraZhELIZhHeLtJELY1VC4Y7HHqoXJABYdNHa5bJDrLvfHfbrPZJI7nGZpdVNJ4lRIpaznRqp1hCq55ZC6IRPd8oPjW8Y5jSr45dEJppNHcIjLHZY5ja6rrhFK45pVqI5rGI4AHHNpx3ANA="
},
{
name: "pawn",
data: "gEBAP4B/AP4B/AP4BEAA455HuY7/Hf47xAB47/PuI1xPZY7/Hf47/G9Y/zHfIATHPI9nHfYB/AOYAfHf4B/AP4B/APA="
}, },
{ {
name: "sleep", name: "sleep",
@ -122,12 +94,28 @@ const icons = [
data: "gEBAP4B/AKyb7HfIAFHPI77Ov451Hf453Hf453HdoAbHf45/Hf5HrHNY7NHNo7/HO47/HO47HHPJ1/Heo51HfoB/ALg=" data: "gEBAP4B/AKyb7HfIAFHPI77Ov451Hf453Hf453HdoAbHf45/Hf5HrHNY7NHNo7/HO47/HO47HHPJ1/Heo51HfoB/ALg="
}, },
{ {
name: "wag_h", name: "happy",
data: "gEBAP4B/AP4B/AP4B/AP4B/AMwADD+oAFHb4hTHMIlXHMopTHNItPAG47/WfY9tFKY9lEq49hELY7ja8YB/AP4B/AP4B/AP4B/AP4BCA" data: "gEBAP4B/AP4BKa+oAXHNITfHK4ZtD5JZfHOojZaMYlXHMYnXHfI5nFaYPLaaIRNHf47/d/47/HtInTCZrfZHa4vNABYlVKLI3PbLrzfD7qTXDLaphHMIpLAB45hIKY1pAP4B/AMA"
}, },
{ {
name: "wag_v", name: "sad",
data: "gEBAP4B/AP4BOafIAHHPI9xAB45vd449rFZIHLHsonJBKa7rGNo7/Hf47/Hf47/Hf47/Hf4xlBKY7hFIoHLQM4rHApK7rAB71xHOo9LHOI9HHOoB/AP4BYA=" data: "gEBAP4B/AP4BKa+oAXHNITfHK4ZtD5JZfHOojZaMYlXHMYnXHfI5nFaYPLaaIRNHf47/d/47/CK4njCZ4APHcIVJBbbdTecYjZHr4fdSa4ZbEZ4lNCaY9dAB45hIKY1pAP4B/AMA"
},
{
name: "hover",
data: "gEBAP4B/AP7NedL4fZK7ojNHeJ35DJI7vC5Y7tVMI7XHNYnNYro7hHKI7lAK47/HdoAhHPI7/Hf47/Hf4AtHPI7/Hf47/Hd45LAP4B/ANwA="
},
{
name: "light",
data: "gEBAP4B/APi/Na67lfACZ/nNaI9lE6o9jEbI9hD7Y7dDsJZ3D6YRJHdIJHHfaz7Hf5Z/Hf4hZHMIjFEqIVVHsY5hDpI7TEqL1jVsqlTdM55THOJvHOuY7/HfI9JHOI9HHOoBgA=="
},
{
name: "speak",
data: "gEBAP4B/AP4BIbO4AXG+4/hAEY55HqoArHPI9PHfIAzHf47/Hf47/HeY9xHJI79Hto5NHtY5RHc45THco5VHcI3XHJpHRG7I7LEro5ZG+IB/AP4BwA=="
},
{
name: "dalek",
data: "gEBAP4B/AP4B/AJMQwQBBGucIoMAkADBhFhAoZBcAAQfJhEgB45BCHYMBjGiB4ZLCK5APDFpphBC5AbEJosY0YfCG4IAEJIYdGFYR5LHJYlEAI0Y4cY8YXMOpQBFlNFlMkOZA7MKII7JOAXkE4T1UERKtFHoxJBABY5QiGiD5kANYTnCiFiWIJVOgDZCOra3FoKxFDKI7hADQ7PkEIaoIHEaKYfJAoKPFAJcIGYIJHkI7UgMY8ZFHC5rVDKIZTCDIJhBA4ILBBoYFHC4QBEBogpBjHDdsJJEAoYAHKoTxWWb5tNWZOiHZRbBHbwtLF5ynBL7wtLjHjd6oAZkHkI5JJKAAZ3TkAjJhALBsJ5K0a/KkLvfkMEFpVhO8hrIU4QLGG4QAzkCdVAP4B/AP4Bb"
} }
]; ];
@ -157,69 +145,79 @@ the program and it may be adviable to use the 'status_name'
format to ensure it is clear. format to ensure it is clear.
*/ */
var joystickBtn = { var happyBtn = {
primary_colour: 0x653E, primary_colour: 0x653E,
primary_icon: 'joystick', primary_text: 'Speak',
primary_text: 'Joystick', primary_icon: 'happy',
}; };
var turnLeftBtn = { var sadBtn = {
primary_colour: 0x653E,
primary_text: 'Left',
primary_icon: 'left',
};
var turnRightBtn = {
primary_colour: 0x33F9, primary_colour: 0x33F9,
primary_text: 'Right', primary_text: 'Speak',
primary_icon: 'right', primary_icon: 'sad',
}; };
var tailHBtn = { var speakBtn = {
primary_colour: 0x653E,
primary_text: 'Wag Tail',
primary_icon: 'wag_h',
};
var tailVBtn = {
primary_colour: 0x33F9, primary_colour: 0x33F9,
primary_text: 'Wag Tail', primary_text: 'Speak',
primary_icon: 'wag_v', primary_icon: 'speak',
}; };
var chessBtn = { var faceBtn = {
primary_colour: 0xE9C7, primary_colour: 0xE9C7,
primary_text: 'Off', primary_text: 'Off',
primary_icon: 'pawn', primary_icon: 'facerecog',
toggle: true, toggle: true,
secondary_colour: 0x3F48, secondary_colour: 0x3F48,
secondary_text: 'On', secondary_text: 'On',
secondary_icon : 'pawn', secondary_icon : 'facerecog',
value: status_chess value: status_face
}; };
var wakeBtn = { var irisLightBtn = {
primary_colour: 0xE9C7, primary_colour: 0xE9C7,
primary_text: 'Sleeping', primary_text: 'Off',
primary_icon: 'light',
toggle: true,
secondary_colour: 0x3F48,
secondary_text: 'On',
secondary_icon : 'light',
value: status_iris_light
};
var irisBtn = {
primary_colour: 0xE9C7,
primary_text: 'Closed',
primary_icon: 'sleep', primary_icon: 'sleep',
toggle: true, toggle: true,
secondary_colour: 0x3F48, secondary_colour: 0x3F48,
secondary_text: 'Awake', secondary_text: 'Open',
secondary_icon : 'awake', secondary_icon : 'awake',
value: status_wake value: status_iris
}; };
var autoBtn = { var hoverBtn = {
primary_colour: 0xE9C7, primary_colour: 0xE9C7,
primary_text: 'Stop', primary_text: 'Off',
primary_icon: 'sit', primary_icon: 'hover',
toggle: true, toggle: true,
secondary_colour: 0x3F48, secondary_colour: 0x3F48,
secondary_text: 'Move', secondary_text: 'On',
secondary_icon : 'walk', secondary_icon : 'hover',
value: status_auto value: status_hover
}; };
var domeBtn = {
primary_colour: 0xE9C7,
primary_text: 'Off',
primary_icon: 'dalek',
toggle: true,
secondary_colour: 0x3F48,
secondary_text: 'On',
secondary_icon : 'dalek',
value: status_dome
};
/* /*
CONFIGURATION AREA - SCREEN DEFINITIONS CONFIGURATION AREA - SCREEN DEFINITIONS
a screen can have a button (as defined above) a screen can have a button (as defined above)
@ -230,35 +228,32 @@ the left hand side of the screen. These
are defined as btn1, bt2 and bt3. The are defined as btn1, bt2 and bt3. The
values are names from the icon array. values are names from the icon array.
*/ */
const menuScreen = { const menuScreen = {
left: wakeBtn, left: faceBtn,
right: joystickBtn, right: speakBtn,
btn1: "pawn", btn1: "hover",
btn2: "wag_h", btn2: "light",
};
const speakScreen = {
left: happyBtn,
right: sadBtn,
btn3: "back" btn3: "back"
}; };
const joystickScreen = { const irisScreen = {
left: turnLeftBtn, left: irisBtn,
right: turnRightBtn, right: irisLightBtn,
btn1: "forward",
btn2: "backward",
btn3: "back" btn3: "back"
}; };
const tailScreen = { const lightsScreen = {
left: tailHBtn, left: hoverBtn,
right: tailVBtn, right: domeBtn,
btn3: "back" btn3: "back"
}; };
const chessScreen = {
left: chessBtn,
right: autoBtn,
btn3: "back"
};
/* base state definition /* base state definition
Each of the screens correspond to a state; Each of the screens correspond to a state;
this class provides a constuctor for each this class provides a constuctor for each
@ -293,22 +288,28 @@ one, then the state machine will change to that new State and redrsw
the screen appropriately. the screen appropriately.
To add in additional capabilities for button presses, simply add To add in additional capabilities for button presses, simply add
an additional 'if' statement. an additional 'if' statement.
For toggle buttons, the value of the appropiate status object is For toggle buttons, the value of the sppropiate status object is
inversed and the new value transmitted. inversed and the new value transmitted.
*/ */
/* The Home State/Page is where the application beings */ /* The Home State/Page is where the application beings */
const Home = new State({ const Home = new State({
state: "K9Menu", state: "DalekMenu",
screen: menuScreen, screen: menuScreen,
events: (event) => { events: (event) => {
if ((event.object == "top") && (event.status == "end")) {
return Lights;
}
if ((event.object == "middle") && (event.status == "end")) {
return Iris;
}
if ((event.object == "right") && (event.status == "end")) { if ((event.object == "right") && (event.status == "end")) {
return Joystick; return Speak;
} }
if ((event.object == "left") && (event.status == "end")) { if ((event.object == "left") && (event.status == "end")) {
status_wake.value = !status_wake.value; status_face.value = !status_face.value;
transmit(this.state, "wake", onOff(status_wake.value)); transmit(this.state, "face", onOff(status_face.value));
return this; return this;
} }
transmit(this.state, event.object, event.status); transmit(this.state, event.object, event.status);
@ -316,31 +317,9 @@ const Home = new State({
} }
}); });
const Chess = new State({ const Speak = new State({
state: "Chess", state: "Speak",
screen: chessScreen, screen: speakScreen,
events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) {
return Home;
}
if ((event.object == "right") && (event.status == "end")) {
status_auto.value = !status_auto.value;
transmit(this.state, "follow", onOff(status_auto.value));
return this;
}
if ((event.object == "left") && (event.status == "end")) {
status_chess.value = !status_chess.value;
transmit(this.state, "chess", onOff(status_chess.value));
return this;
}
transmit(this.state, event.object, event.status);
return this;
}
});
const Tail = new State({
state: "Tail",
screen: tailScreen,
events: (event) => { events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) { if ((event.object == "bottom") && (event.status == "end")) {
return Home; return Home;
@ -350,18 +329,48 @@ const Tail = new State({
} }
}); });
/* Joystick page state */ const Iris = new State({
const Joystick = new State({ state: "Iris",
state: "Joystick", screen: irisScreen,
screen: joystickScreen,
events: (event) => { events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) { if ((event.object == "bottom") && (event.status == "end")) {
transmit("Joystick", "joystick", "off"); return Home;
return Home; }
} if ((event.object == "right") && (event.status == "end")) {
status_iris_light.value = !status_iris_light.value;
transmit(this.state, "light", onOff(status_iris_light.value));
return this;
}
if ((event.object == "left") && (event.status == "end")) {
status_iris.value = !status_iris.value;
transmit(this.state, "servo", onOff(status_iris.value));
return this;
}
transmit(this.state, event.object, event.status); transmit(this.state, event.object, event.status);
return this; return this;
} }
});
const Lights = new State({
state: "Lights",
screen: lightsScreen,
events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) {
return Home;
}
if ((event.object == "right") && (event.status == "end")) {
status_dome.value = !status_dome.value;
transmit(this.state, "dome", onOff(status_dome.value));
return this;
}
if ((event.object == "left") && (event.status == "end")) {
status_hover.value = !status_hover.value;
transmit(this.state, "hover", onOff(status_hover.value));
return this;
}
transmit(this.state, event.object, event.status);
return this;
}
}); });
/* translate button status into english */ /* translate button status into english */
@ -417,7 +426,7 @@ const drawButton = (params,side) => {
text = params.secondary_text; text = params.secondary_text;
icon = drawIcon(params.secondary_icon); icon = drawIcon(params.secondary_icon);
} }
g.fillRect(0+x,28,119+x, 239); g.fillRect(0+x,24,119+x, 239);
g.setColor(0x000); g.setColor(0x000);
g.setFont("Vector",15); g.setFont("Vector",15);
g.setFontAlign(0,0.0); g.setFontAlign(0,0.0);

View File

@ -19,18 +19,18 @@ bottom_btn = false;
msgNum = 0; // message number msgNum = 0; // message number
NRF.setConnectionInterval(100);
Bangle.loadWidgets();
Bangle.drawWidgets();
/* /*
CONFIGURATION AREA - STATE VARIABLES CONFIGURATION AREA - STATE VARIABLES
declare global variables for the toggle button declare global variables for the toggle button
statuses; if you add an additional toggle button statuses; if you add an additional toggle button
you should declare it and initiase it here */ you should declare it and initiase it here */
var status_spk = {value: true}; var status_auto = {value: false};
var status_face = {value: true}; var status_chess = {value: false};
var status_iris_light = {value: false}; var status_wake = {value: false};
var status_iris = {value: false};
var status_hover = {value: false};
var status_dome = {value: false};
/* trsnsmit message /* trsnsmit message
where where
@ -69,21 +69,49 @@ Add an additional element to the icons array
with a unique name and the data from the Image Object with a unique name and the data from the Image Object
*/ */
const icons = [ const icons = [
{
name: "walk",
data: "gEBAP4B/ALyh7b/YALHfY9tACY55HfYdNHto7pHpIbXbL5fXAD6VlHuYAjHf47/Hf47tHK47LDa45zHc4NHHeILJHeonTO9o9rHf47/eOoB/ANg="
},
{
name: "sit",
data: "gEBAP4B/AP4BacO4ANHPI/rACp1/Hf49rGtI5/He7n3ACY55HcYAZHf45/Hf45rHe4XHGbI7/Va47zZZrpbHfbtXD5Y/vHcYB/AP4BmA"
},
{
name: "joystick",
data: "gEBAP4B/AP4BMavIALHPI9vHf47/eP45vHpY5xHo451Hf47/FuYAHHNItHABa33AP6xpAD455HqY7/Hf47/Hd49pHKIB/AP4B/AMwA=="
},
{
name: "left",
data: "gEBAP4B/AP4BKa9ojHAC5pfHJKDTUsYdZHb6ZfO+I9dABabdLbIBdHf473PP47NJdY7/ePIB/RJop5Ys7t/AP6PvD7o7fP8Y1zTZoHPf/4B/AP4B+A=="
},
{
name: "right",
data: "gEBAP4B/AP4BKa+oAXDo45hCaqFbUbLBfbbo7bHMojTR7Y5LHa51ZALo75Ov47/FeY77AP4B5WdbF3dv4B/R94fdHb5/jGuabNA57//AP4B/APw="
},
{
name: "forward",
data: "gEBAP4B/AKSX5avIALHPI9tACY55HsoAbHPI9fHfZFVGMo7/Hf47/Hf47/Hf47/Hf47/Hf47/Hf47/Hf49XHOIB/ALw="
},
{
name: "backward",
data: "gEBAP4B/AKCZ5a/Y7/Hf47/Hf47/Hf47/Hf47/Hf47/Hf47/HfIAfHf491W/L15HMo9THNI9PHNo9LHOI9HHOoB/ALg="
},
{ {
name: "back", name: "back",
data: "gEBAP4B/AP4B/AKgADHPI71HP45/HP45/HP45/HP45/Hf49/Hv49/Hv49/Hv49/Hv497He4B/AP4B/AJAA==" data: "gEBAP4B/AP4B/AKgADHPI71HP45/HP45/HP45/HP45/Hf49/Hv49/Hv49/Hv49/Hv497He4B/AP4B/AJAA=="
}, },
{ {
name: "spk_on", name: "mic_on",
data: "gEBAP4B/AP4Bic/YAFPP4v1HrYZRVJo7ZDKp5jMJYvZHaYAHVL4LHACZrhADLBTJKI7dPLI7/Hf47/HeZBVFqZHZRJp1lAJ47LOtZTnHbIZDKLpHNAL69ZANp1tQbY5/AP4B/ANQ" data: "gEBAP4B/AKCZ5a/Y7/Hf47/Hf47/Hf47/GbY7TIcY7/Hf47/Hf47/HdY9NCpp5lCb57fOdYvNeJo91HNrlvHf7tVIdY77AP4BiA="
},
{
name: "spk_off",
data: "gEBAPhB7P/o9rFKI9pFKY9tXNYZNHrZXfMaoAHPOZhNF7LdXHpKpZEJpvPDZK1ZAB49NPLo9jHdI9NHd49PHebvxEJY9NI6I7dHpaDXcKqfPHLKjZHcpTjHbIZDKa73JHa4BXGY45xe5Y7zV+o9/Hv49JHe4BEA="
}, },
{ {
name: "facerecog", name: "comms",
data: "gEBAP4BSLuozNH9YpTHsolXPsYfdDraZhELIZhHeLtJELY1VC4Y7HHqoXJABYdNHa5bJDrLvfHfbrPZJI7nGZpdVNJ4lRIpaznRqp1hCq55ZC6IRPd8oPjW8Y5jSr45dEJppNHcIjLHZY5ja6rrhFK45pVqI5rGI4AHHNpx3ANA=" data: "gEBAP4B+QvbF7ABo7/He49tACI7/Hf47zHtI7jJq47lRqoAVEqY7nHsoAZGJo71HrKxfQaY7bdKo7/Hdqz5B5Y7zHK47RD55FRHao3XHKo7JG7L1NHeJTbHboB/AP4BG"
},
{
name: "pawn",
data: "gEBAP4B/AP4B/AP4BEAA455HuY7/Hf47xAB47/PuI1xPZY7/Hf47/G9Y/zHfIATHPI9nHfYB/AOYAfHf4B/AP4B/APA="
}, },
{ {
name: "sleep", name: "sleep",
@ -94,28 +122,12 @@ const icons = [
data: "gEBAP4B/AKyb7HfIAFHPI77Ov451Hf453Hf453HdoAbHf45/Hf5HrHNY7NHNo7/HO47/HO47HHPJ1/Heo51HfoB/ALg=" data: "gEBAP4B/AKyb7HfIAFHPI77Ov451Hf453Hf453HdoAbHf45/Hf5HrHNY7NHNo7/HO47/HO47HHPJ1/Heo51HfoB/ALg="
}, },
{ {
name: "happy", name: "wag_h",
data: "gEBAP4B/AP4BKa+oAXHNITfHK4ZtD5JZfHOojZaMYlXHMYnXHfI5nFaYPLaaIRNHf47/d/47/HtInTCZrfZHa4vNABYlVKLI3PbLrzfD7qTXDLaphHMIpLAB45hIKY1pAP4B/AMA" data: "gEBAP4B/AP4B/AP4B/AP4B/AMwADD+oAFHb4hTHMIlXHMopTHNItPAG47/WfY9tFKY9lEq49hELY7ja8YB/AP4B/AP4B/AP4B/AP4BCA"
}, },
{ {
name: "sad", name: "wag_v",
data: "gEBAP4B/AP4BKa+oAXHNITfHK4ZtD5JZfHOojZaMYlXHMYnXHfI5nFaYPLaaIRNHf47/d/47/CK4njCZ4APHcIVJBbbdTecYjZHr4fdSa4ZbEZ4lNCaY9dAB45hIKY1pAP4B/AMA" data: "gEBAP4B/AP4BOafIAHHPI9xAB45vd449rFZIHLHsonJBKa7rGNo7/Hf47/Hf47/Hf47/Hf4xlBKY7hFIoHLQM4rHApK7rAB71xHOo9LHOI9HHOoB/AP4BYA="
},
{
name: "hover",
data: "gEBAP4B/AP7NedL4fZK7ojNHeJ35DJI7vC5Y7tVMI7XHNYnNYro7hHKI7lAK47/HdoAhHPI7/Hf47/Hf4AtHPI7/Hf47/Hd45LAP4B/ANwA="
},
{
name: "light",
data: "gEBAP4B/APi/Na67lfACZ/nNaI9lE6o9jEbI9hD7Y7dDsJZ3D6YRJHdIJHHfaz7Hf5Z/Hf4hZHMIjFEqIVVHsY5hDpI7TEqL1jVsqlTdM55THOJvHOuY7/HfI9JHOI9HHOoBgA=="
},
{
name: "speak",
data: "gEBAP4B/AP4BIbO4AXG+4/hAEY55HqoArHPI9PHfIAzHf47/Hf47/HeY9xHJI79Hto5NHtY5RHc45THco5VHcI3XHJpHRG7I7LEro5ZG+IB/AP4BwA=="
},
{
name: "dalek",
data: "gEBAP4B/AP4B/AJMQwQBBGucIoMAkADBhFhAoZBcAAQfJhEgB45BCHYMBjGiB4ZLCK5APDFpphBC5AbEJosY0YfCG4IAEJIYdGFYR5LHJYlEAI0Y4cY8YXMOpQBFlNFlMkOZA7MKII7JOAXkE4T1UERKtFHoxJBABY5QiGiD5kANYTnCiFiWIJVOgDZCOra3FoKxFDKI7hADQ7PkEIaoIHEaKYfJAoKPFAJcIGYIJHkI7UgMY8ZFHC5rVDKIZTCDIJhBA4ILBBoYFHC4QBEBogpBjHDdsJJEAoYAHKoTxWWb5tNWZOiHZRbBHbwtLF5ynBL7wtLjHjd6oAZkHkI5JJKAAZ3TkAjJhALBsJ5K0a/KkLvfkMEFpVhO8hrIU4QLGG4QAzkCdVAP4B/AP4Bb"
} }
]; ];
@ -145,79 +157,69 @@ the program and it may be adviable to use the 'status_name'
format to ensure it is clear. format to ensure it is clear.
*/ */
var happyBtn = { var joystickBtn = {
primary_colour: 0x653E, primary_colour: 0x653E,
primary_text: 'Speak', primary_icon: 'joystick',
primary_icon: 'happy', primary_text: 'Joystick',
}; };
var sadBtn = { var turnLeftBtn = {
primary_colour: 0x653E,
primary_text: 'Left',
primary_icon: 'left',
};
var turnRightBtn = {
primary_colour: 0x33F9, primary_colour: 0x33F9,
primary_text: 'Speak', primary_text: 'Right',
primary_icon: 'sad', primary_icon: 'right',
}; };
var speakBtn = { var tailHBtn = {
primary_colour: 0x653E,
primary_text: 'Wag Tail',
primary_icon: 'wag_h',
};
var tailVBtn = {
primary_colour: 0x33F9, primary_colour: 0x33F9,
primary_text: 'Speak', primary_text: 'Wag Tail',
primary_icon: 'speak', primary_icon: 'wag_v',
}; };
var faceBtn = { var chessBtn = {
primary_colour: 0xE9C7, primary_colour: 0xE9C7,
primary_text: 'Off', primary_text: 'Off',
primary_icon: 'facerecog', primary_icon: 'pawn',
toggle: true, toggle: true,
secondary_colour: 0x3F48, secondary_colour: 0x3F48,
secondary_text: 'On', secondary_text: 'On',
secondary_icon : 'facerecog', secondary_icon : 'pawn',
value: status_face value: status_chess
}; };
var irisLightBtn = { var wakeBtn = {
primary_colour: 0xE9C7, primary_colour: 0xE9C7,
primary_text: 'Off', primary_text: 'Sleeping',
primary_icon: 'light',
toggle: true,
secondary_colour: 0x3F48,
secondary_text: 'On',
secondary_icon : 'light',
value: status_iris_light
};
var irisBtn = {
primary_colour: 0xE9C7,
primary_text: 'Closed',
primary_icon: 'sleep', primary_icon: 'sleep',
toggle: true, toggle: true,
secondary_colour: 0x3F48, secondary_colour: 0x3F48,
secondary_text: 'Open', secondary_text: 'Awake',
secondary_icon : 'awake', secondary_icon : 'awake',
value: status_iris value: status_wake
}; };
var hoverBtn = { var autoBtn = {
primary_colour: 0xE9C7, primary_colour: 0xE9C7,
primary_text: 'Off', primary_text: 'Stop',
primary_icon: 'hover', primary_icon: 'sit',
toggle: true, toggle: true,
secondary_colour: 0x3F48, secondary_colour: 0x3F48,
secondary_text: 'On', secondary_text: 'Move',
secondary_icon : 'hover', secondary_icon : 'walk',
value: status_hover value: status_auto
}; };
var domeBtn = {
primary_colour: 0xE9C7,
primary_text: 'Off',
primary_icon: 'dalek',
toggle: true,
secondary_colour: 0x3F48,
secondary_text: 'On',
secondary_icon : 'dalek',
value: status_dome
};
/* /*
CONFIGURATION AREA - SCREEN DEFINITIONS CONFIGURATION AREA - SCREEN DEFINITIONS
a screen can have a button (as defined above) a screen can have a button (as defined above)
@ -228,32 +230,35 @@ the left hand side of the screen. These
are defined as btn1, bt2 and bt3. The are defined as btn1, bt2 and bt3. The
values are names from the icon array. values are names from the icon array.
*/ */
const menuScreen = { const menuScreen = {
left: faceBtn, left: wakeBtn,
right: speakBtn, right: joystickBtn,
btn1: "hover", btn1: "pawn",
btn2: "light", btn2: "wag_h",
};
const speakScreen = {
left: happyBtn,
right: sadBtn,
btn3: "back" btn3: "back"
}; };
const irisScreen = { const joystickScreen = {
left: irisBtn, left: turnLeftBtn,
right: irisLightBtn, right: turnRightBtn,
btn1: "forward",
btn2: "backward",
btn3: "back" btn3: "back"
}; };
const lightsScreen = { const tailScreen = {
left: hoverBtn, left: tailHBtn,
right: domeBtn, right: tailVBtn,
btn3: "back" btn3: "back"
}; };
const chessScreen = {
left: chessBtn,
right: autoBtn,
btn3: "back"
};
/* base state definition /* base state definition
Each of the screens correspond to a state; Each of the screens correspond to a state;
this class provides a constuctor for each this class provides a constuctor for each
@ -288,28 +293,22 @@ one, then the state machine will change to that new State and redrsw
the screen appropriately. the screen appropriately.
To add in additional capabilities for button presses, simply add To add in additional capabilities for button presses, simply add
an additional 'if' statement. an additional 'if' statement.
For toggle buttons, the value of the sppropiate status object is For toggle buttons, the value of the appropiate status object is
inversed and the new value transmitted. inversed and the new value transmitted.
*/ */
/* The Home State/Page is where the application beings */ /* The Home State/Page is where the application beings */
const Home = new State({ const Home = new State({
state: "DalekMenu", state: "K9Menu",
screen: menuScreen, screen: menuScreen,
events: (event) => { events: (event) => {
if ((event.object == "top") && (event.status == "end")) {
return Lights;
}
if ((event.object == "middle") && (event.status == "end")) {
return Iris;
}
if ((event.object == "right") && (event.status == "end")) { if ((event.object == "right") && (event.status == "end")) {
return Speak; return Joystick;
} }
if ((event.object == "left") && (event.status == "end")) { if ((event.object == "left") && (event.status == "end")) {
status_face.value = !status_face.value; status_wake.value = !status_wake.value;
transmit(this.state, "face", onOff(status_face.value)); transmit(this.state, "wake", onOff(status_wake.value));
return this; return this;
} }
transmit(this.state, event.object, event.status); transmit(this.state, event.object, event.status);
@ -317,9 +316,31 @@ const Home = new State({
} }
}); });
const Speak = new State({ const Chess = new State({
state: "Speak", state: "Chess",
screen: speakScreen, screen: chessScreen,
events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) {
return Home;
}
if ((event.object == "right") && (event.status == "end")) {
status_auto.value = !status_auto.value;
transmit(this.state, "follow", onOff(status_auto.value));
return this;
}
if ((event.object == "left") && (event.status == "end")) {
status_chess.value = !status_chess.value;
transmit(this.state, "chess", onOff(status_chess.value));
return this;
}
transmit(this.state, event.object, event.status);
return this;
}
});
const Tail = new State({
state: "Tail",
screen: tailScreen,
events: (event) => { events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) { if ((event.object == "bottom") && (event.status == "end")) {
return Home; return Home;
@ -329,48 +350,18 @@ const Speak = new State({
} }
}); });
const Iris = new State({ /* Joystick page state */
state: "Iris", const Joystick = new State({
screen: irisScreen, state: "Joystick",
screen: joystickScreen,
events: (event) => { events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) { if ((event.object == "bottom") && (event.status == "end")) {
return Home; transmit("Joystick", "joystick", "off");
} return Home;
if ((event.object == "right") && (event.status == "end")) { }
status_iris_light.value = !status_iris_light.value;
transmit(this.state, "light", onOff(status_iris_light.value));
return this;
}
if ((event.object == "left") && (event.status == "end")) {
status_iris.value = !status_iris.value;
transmit(this.state, "servo", onOff(status_iris.value));
return this;
}
transmit(this.state, event.object, event.status); transmit(this.state, event.object, event.status);
return this; return this;
} }
});
const Lights = new State({
state: "Lights",
screen: lightsScreen,
events: (event) => {
if ((event.object == "bottom") && (event.status == "end")) {
return Home;
}
if ((event.object == "right") && (event.status == "end")) {
status_dome.value = !status_dome.value;
transmit(this.state, "dome", onOff(status_dome.value));
return this;
}
if ((event.object == "left") && (event.status == "end")) {
status_hover.value = !status_hover.value;
transmit(this.state, "hover", onOff(status_hover.value));
return this;
}
transmit(this.state, event.object, event.status);
return this;
}
}); });
/* translate button status into english */ /* translate button status into english */
@ -426,7 +417,7 @@ const drawButton = (params,side) => {
text = params.secondary_text; text = params.secondary_text;
icon = drawIcon(params.secondary_icon); icon = drawIcon(params.secondary_icon);
} }
g.fillRect(0+x,24,119+x, 239); g.fillRect(0+x,28,119+x, 239);
g.setColor(0x000); g.setColor(0x000);
g.setFont("Vector",15); g.setFont("Vector",15);
g.setFontAlign(0,0.0); g.setFontAlign(0,0.0);