179 lines
6.0 KiB
TypeScript
179 lines
6.0 KiB
TypeScript
|
let wasShake: boolean
|
||
|
|
||
|
input.onShake(() => {
|
||
|
wasShake = true
|
||
|
})
|
||
|
wait_6Hours()
|
||
|
timeForTest()
|
||
|
alertnessTest()
|
||
|
wait_2Hours()
|
||
|
timeForTest()
|
||
|
alertnessTest()
|
||
|
wait_2Hours()
|
||
|
timeForTest()
|
||
|
alertnessTest()
|
||
|
|
||
|
/**
|
||
|
* animate back to work
|
||
|
* animate take a rest
|
||
|
*/
|
||
|
function animations() { }
|
||
|
|
||
|
/**
|
||
|
* wait 6 hours
|
||
|
* because this is a test program, we only wait for a short time
|
||
|
*/
|
||
|
function wait_6Hours() {
|
||
|
basic.showAnimation(`
|
||
|
. . # . . . . . . # . . . . . . . . . . . . . . . . . . . . . . . . . # . . . .
|
||
|
. . # . . . . . # . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . .
|
||
|
. . # . . . . # . . . . # # # . . # . . . . # . . . . # . . # # # . . . . # . .
|
||
|
. . . . . . . . . . . . . . . . . . # . . . # . . . # . . . . . . . . . . . . .
|
||
|
. . . . . . . . . . . . . . . . . . . # . . # . . # . . . . . . . . . . . . . .
|
||
|
`, 500)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* wait for 2 hours
|
||
|
* because this is test code, we only wait a few seconds
|
||
|
*/
|
||
|
function wait_2Hours() {
|
||
|
basic.showAnimation(`
|
||
|
. . # . . . . . . # . . . . . . . . . . . . . . . . . . . . . . . . . # . . . .
|
||
|
. . # . . . . . # . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . .
|
||
|
. . # . . . . # . . . . # # # . . # . . . . # . . . . # . . # # # . . . . # . .
|
||
|
. . . . . . . . . . . . . . . . . . # . . . # . . . # . . . . . . . . . . . . .
|
||
|
. . . . . . . . . . . . . . . . . . . # . . # . . # . . . . . . . . . . . . . .
|
||
|
`, 500)
|
||
|
}
|
||
|
|
||
|
function alertnessTest() {
|
||
|
let goodResponse = 1000
|
||
|
let threshold = 5
|
||
|
let score = 0
|
||
|
// Start test on button press
|
||
|
let x = 0
|
||
|
let start = images.createImage(`
|
||
|
. . # . . . . # . .
|
||
|
. . # . . . # . # .
|
||
|
. . # . . . . . # .
|
||
|
. . . . . . . # . .
|
||
|
. . # . . . . # . .
|
||
|
`)
|
||
|
while (!input.buttonIsPressed(Button.B)) {
|
||
|
start.showImage(x)
|
||
|
x = x + 5
|
||
|
if (x >= start.width()) {
|
||
|
x = 0
|
||
|
}
|
||
|
basic.pause(300)
|
||
|
}
|
||
|
// Wait for button(s) to be released
|
||
|
while (input.buttonIsPressed(Button.A) || input.buttonIsPressed(Button.B)) {
|
||
|
basic.pause(100)
|
||
|
}
|
||
|
// Run 10 random cognition response tests
|
||
|
for (let i = 0; i < 9; i++) {
|
||
|
// Choose random delay and random outcome
|
||
|
let delay = Math.random(5) + 5
|
||
|
let outcome = Math.random(2)
|
||
|
// Draw moving dots on screen until delay expires
|
||
|
basic.clearScreen()
|
||
|
for (let j = 0; j < delay; j++) {
|
||
|
led.plot(j % 5, 2)
|
||
|
basic.pause(200)
|
||
|
basic.clearScreen()
|
||
|
}
|
||
|
// Show shake or button icon
|
||
|
if (outcome == 0) {
|
||
|
// Press the button!
|
||
|
basic.showLeds(`
|
||
|
. . . . .
|
||
|
. # # # .
|
||
|
. # # # .
|
||
|
. # # # .
|
||
|
. . . . .
|
||
|
`)
|
||
|
} else {
|
||
|
// Shake the bit!
|
||
|
basic.showLeds(`
|
||
|
# . # . .
|
||
|
# . . # .
|
||
|
# # # # #
|
||
|
# . . # .
|
||
|
# . # . .
|
||
|
`)
|
||
|
}
|
||
|
// Wait up to 3 seconds for button, shake, or timeout
|
||
|
wasShake = false
|
||
|
let timer = input.runningTime()
|
||
|
let timeout = 3000
|
||
|
while (input.runningTime() < timer + timeout) {
|
||
|
if (wasShake) {
|
||
|
break
|
||
|
} else if (input.buttonIsPressed(Button.B)) {
|
||
|
break
|
||
|
} else {
|
||
|
basic.pause(100)
|
||
|
}
|
||
|
}
|
||
|
// Assess the response and the response time
|
||
|
let response = input.runningTime() - timer
|
||
|
if (outcome == 0 && input.buttonIsPressed(Button.B) && response <= goodResponse) {
|
||
|
score = score + 1
|
||
|
} else if (outcome == 1 && wasShake && response <= goodResponse) {
|
||
|
score = score + 1
|
||
|
}
|
||
|
}
|
||
|
// Show final score flashing 5 times (0..9)
|
||
|
for (let k = 0; k < 5; k++) {
|
||
|
basic.showNumber(score, 0)
|
||
|
basic.pause(250)
|
||
|
basic.clearScreen()
|
||
|
basic.pause(250)
|
||
|
}
|
||
|
basic.showNumber(score, 0)
|
||
|
basic.pause(500)
|
||
|
if (score < threshold) {
|
||
|
// Time for a break, show coffee cup animation
|
||
|
for (let l = 0; l < 3; l++) {
|
||
|
basic.showAnimation(`
|
||
|
. . . . . . . . . . . # . . . . # . . . . . . . . . . # . . . . # . . . . . . .
|
||
|
. . . . . . # . . . . # . . . . . . . . . . # . . . . # . . . . . . . . . . . .
|
||
|
# . . # . # # . # . # . . # . # . . # . # . # # . # . . # . # . . # . # . . # .
|
||
|
# . . # # # . . # # # . . # # # . . # # # . . # # # . . # # # . . # # # . . # #
|
||
|
# # # # . # # # # . # # # # . # # # # . # # # # . # # # # . # # # # . # # # # .
|
||
|
`, 400)
|
||
|
}
|
||
|
} else {
|
||
|
// All ok, back to work, show digging animation
|
||
|
for (let m = 0; m < 3; m++) {
|
||
|
basic.showAnimation(`
|
||
|
# . # . . # . . . . # . . . .
|
||
|
. # # . . . # . # . . # . . .
|
||
|
# # # . . . . # # . . . # . #
|
||
|
. . . . . . # # # . . . . # #
|
||
|
. . . . . . . . . . . . # # #
|
||
|
`, 400)
|
||
|
}
|
||
|
}
|
||
|
// Wait for any button press to finish test
|
||
|
while (!input.buttonIsPressed(Button.A) && !input.buttonIsPressed(Button.B)) {
|
||
|
basic.pause(100)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* alert the user it is time to take the test
|
||
|
* in a real system, this might give them 5 1 minute warnings
|
||
|
*/
|
||
|
function timeForTest() {
|
||
|
basic.showAnimation(`
|
||
|
. # # # . . # . . . . # # . . . # # . . . . # . .
|
||
|
. # . . . . # . . . . . . # . . . . # . . # # . .
|
||
|
. . # . . . # # # . . # # . . . . # . . . . # . .
|
||
|
. . . # . . . # . . . . . # . . # . . . . . # . .
|
||
|
. # # . . . . # . . . # # . . . # # # . . # # # .
|
||
|
`, 700)
|
||
|
}
|