489 lines
15 KiB
TypeScript
489 lines
15 KiB
TypeScript
let AWasPressed: boolean
|
|
let BWasPressed: boolean
|
|
let wasShake: boolean
|
|
let dots025: Image
|
|
|
|
dots025 = images.createImage(`
|
|
. . . . . # . . . . # # . . . # # # . . # # # # . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # . # # # # #
|
|
`)
|
|
let tests = "DABPXYZSCT"
|
|
let test = 0
|
|
let prevTest = -1
|
|
startIOMonitor()
|
|
while (true) {
|
|
let testLetter = tests[test]
|
|
let autoRun = false
|
|
if (testLetter == "D" || testLetter == "A" || testLetter == "B") {
|
|
autoRun = true
|
|
}
|
|
if (!(test == prevTest)) {
|
|
basic.showString(tests[test], 200)
|
|
prevTest = test
|
|
}
|
|
if (AWasPressed || autoRun) {
|
|
AWasPressed = false
|
|
if (testLetter == "D") {
|
|
testDisplay()
|
|
test = test + 1
|
|
} else if (testLetter == "A") {
|
|
testButtonA()
|
|
test = test + 1
|
|
} else if (testLetter == "B") {
|
|
testButtonB()
|
|
test = test + 1
|
|
} else if (testLetter == "P") {
|
|
testPads()
|
|
} else if (testLetter == "X") {
|
|
testTiltX()
|
|
} else if (testLetter == "Y") {
|
|
testTiltY()
|
|
} else if (testLetter == "Z") {
|
|
testTiltZ()
|
|
} else if (testLetter == "S") {
|
|
testShake()
|
|
} else if (testLetter == "C") {
|
|
testCompass()
|
|
} else if (testLetter == "T") {
|
|
testTemperature()
|
|
} else {
|
|
// end of tests
|
|
basic.showLeds(`
|
|
. . . . .
|
|
. . . . #
|
|
. . . # .
|
|
# . # . .
|
|
. # . . .
|
|
`, 400)
|
|
}
|
|
prevTest = -1
|
|
AWasPressed = false
|
|
BWasPressed = false
|
|
} else if (BWasPressed) {
|
|
BWasPressed = false
|
|
if (test < tests.length - 1) {
|
|
test = test + 1
|
|
} else {
|
|
test = 3
|
|
}
|
|
} else {
|
|
basic.pause(100)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* flash all LEDs 5 times
|
|
*/
|
|
function testDisplay() {
|
|
for (let i = 0; i < 5; i++) {
|
|
basic.plotLeds(`
|
|
# # # # #
|
|
# # # # #
|
|
# # # # #
|
|
# # # # #
|
|
# # # # #
|
|
`)
|
|
basic.pause(200)
|
|
basic.clearScreen()
|
|
basic.pause(200)
|
|
}
|
|
// cycle all LEDs from 1 to 25
|
|
basic.showAnimation(`
|
|
# . . . . # # . . . # # # . . # # # # . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # . # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|
|
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . # . . . . # # . . . # # # . . # # # # . # # # # #
|
|
`, 400)
|
|
}
|
|
|
|
function testButtonA() {
|
|
basic.plotLeds(`
|
|
. . # . .
|
|
. # . # .
|
|
. # # # .
|
|
. # . # .
|
|
. # . # .
|
|
`)
|
|
// wait for A pressed
|
|
while (!input.buttonIsPressed(Button.A)) {
|
|
basic.pause(100)
|
|
}
|
|
basic.plotLeds(`
|
|
. # . . .
|
|
# . # . .
|
|
# # # . .
|
|
# . # . .
|
|
# . # . .
|
|
`)
|
|
// wait for A released
|
|
while (input.buttonIsPressed(Button.A)) {
|
|
basic.pause(100)
|
|
}
|
|
basic.plotLeds(`
|
|
. . # . .
|
|
. # . # .
|
|
. # # # .
|
|
. # . # .
|
|
. # . # .
|
|
`)
|
|
basic.pause(1000)
|
|
}
|
|
|
|
function testTiltX() {
|
|
basic.clearScreen()
|
|
let prevx = 0
|
|
while (!AWasPressed && !BWasPressed) {
|
|
basic.pause(100)
|
|
let x = input.acceleration(Dimension.X)
|
|
let x2 = x / 512 + 2
|
|
let x3 = Math.clamp(0, 4, x2)
|
|
// sticky trace
|
|
led.plot(x3, 0)
|
|
// middle line is actual/live
|
|
if (x3 != prevx) {
|
|
led.unplot(prevx, 2)
|
|
prevx = x3
|
|
}
|
|
led.plot(x3, 2)
|
|
// bottom line is -4G, -2G, 1G, +2G, +4G
|
|
if (x <= -2048) {
|
|
led.plot(0, 4)
|
|
} else if (x <= -1024) {
|
|
led.plot(1, 4)
|
|
} else if (x <= 1024) {
|
|
led.plot(2, 4)
|
|
} else if (x <= 2048) {
|
|
led.plot(3, 4)
|
|
} else {
|
|
led.plot(4, 4)
|
|
}
|
|
}
|
|
}
|
|
|
|
function testShake() {
|
|
wasShake = false
|
|
basic.plotLeds(`
|
|
. . . . .
|
|
. . . . .
|
|
. . # . .
|
|
. . . . .
|
|
. . . . .
|
|
`)
|
|
while (!AWasPressed && !BWasPressed) {
|
|
if (wasShake) {
|
|
wasShake = false
|
|
basic.plotLeds(`
|
|
# # # # #
|
|
# # # # #
|
|
# # # # #
|
|
# # # # #
|
|
# # # # #
|
|
`)
|
|
basic.pause(500)
|
|
basic.plotLeds(`
|
|
. . . . .
|
|
. . . . .
|
|
. . # . .
|
|
. . . . .
|
|
. . . . .
|
|
`)
|
|
} else {
|
|
basic.pause(100)
|
|
}
|
|
}
|
|
}
|
|
|
|
function testCompass() {
|
|
if (input.compassHeading() < 0) {
|
|
input.calibrate()
|
|
}
|
|
basic.clearScreen()
|
|
while (!AWasPressed && !BWasPressed) {
|
|
let d = input.compassHeading()
|
|
d = d / 22
|
|
d = Math.clamp(0, 15, d)
|
|
d = (d + 2) % 16
|
|
if (d < 4) {
|
|
led.plot(d, 0)
|
|
} else if (d < 8) {
|
|
led.plot(4, d - 4)
|
|
} else if (d < 12) {
|
|
led.plot(4 - d - 8, 4)
|
|
} else {
|
|
led.plot(0, 4 - d - 12)
|
|
}
|
|
basic.pause(100)
|
|
}
|
|
}
|
|
|
|
function testPads() {
|
|
let TESTSPEED = 500
|
|
AWasPressed = false
|
|
BWasPressed = false
|
|
// Make sure all pins are inputs, before test starts
|
|
let p0 = pins.digitalReadPin(DigitalPin.P0)
|
|
let p1 = pins.digitalReadPin(DigitalPin.P1)
|
|
let p2 = pins.digitalReadPin(DigitalPin.P2)
|
|
let ok0 = 0
|
|
let ok1 = 0
|
|
let ok2 = 0
|
|
while (!AWasPressed && !BWasPressed) {
|
|
basic.clearScreen()
|
|
// ## P0 out low, read from P1 and P2
|
|
ok0 = 0
|
|
pins.digitalWritePin(DigitalPin.P0, 0)
|
|
basic.pause(TESTSPEED)
|
|
p1 = pins.digitalReadPin(DigitalPin.P1)
|
|
p2 = pins.digitalReadPin(DigitalPin.P2)
|
|
if (p1 == 0) {
|
|
led.plot(0, 0)
|
|
ok0 = ok0 + 1
|
|
}
|
|
if (p2 == 0) {
|
|
led.plot(1, 0)
|
|
ok0 = ok0 + 1
|
|
}
|
|
// ## P0 out high, read from P1 and P2
|
|
pins.digitalWritePin(DigitalPin.P0, 1)
|
|
basic.pause(TESTSPEED)
|
|
p1 = pins.digitalReadPin(DigitalPin.P1)
|
|
p2 = pins.digitalReadPin(DigitalPin.P2)
|
|
if (p1 == 1) {
|
|
led.plot(2, 0)
|
|
ok0 = ok0 + 1
|
|
}
|
|
if (p2 == 1) {
|
|
led.plot(3, 0)
|
|
ok0 = ok0 + 1
|
|
}
|
|
// set back to an input
|
|
p0 = pins.digitalReadPin(DigitalPin.P0)
|
|
// ## P1 out low, read from P0 and P2
|
|
ok1 = 0
|
|
pins.digitalWritePin(DigitalPin.P1, 0)
|
|
basic.pause(TESTSPEED)
|
|
p0 = pins.digitalReadPin(DigitalPin.P0)
|
|
p2 = pins.digitalReadPin(DigitalPin.P2)
|
|
if (p0 == 0) {
|
|
led.plot(0, 1)
|
|
ok1 = ok1 + 1
|
|
}
|
|
if (p2 == 0) {
|
|
led.plot(1, 1)
|
|
ok1 = ok1 + 1
|
|
}
|
|
// ## P1 out high, read from P0 and P2
|
|
pins.digitalWritePin(DigitalPin.P1, 1)
|
|
basic.pause(TESTSPEED)
|
|
p0 = pins.digitalReadPin(DigitalPin.P0)
|
|
p2 = pins.digitalReadPin(DigitalPin.P2)
|
|
if (p0 == 1) {
|
|
led.plot(2, 1)
|
|
ok1 = ok1 + 1
|
|
}
|
|
if (p2 == 1) {
|
|
led.plot(3, 1)
|
|
ok1 = ok1 + 1
|
|
}
|
|
// set back to an input
|
|
p0 = pins.digitalReadPin(DigitalPin.P1)
|
|
// ## P2 out low, read from P0 and P1
|
|
ok2 = 0
|
|
pins.digitalWritePin(DigitalPin.P2, 0)
|
|
basic.pause(TESTSPEED)
|
|
p0 = pins.digitalReadPin(DigitalPin.P0)
|
|
p1 = pins.digitalReadPin(DigitalPin.P1)
|
|
if (p0 == 0) {
|
|
led.plot(0, 2)
|
|
ok2 = ok2 + 1
|
|
}
|
|
if (p1 == 0) {
|
|
led.plot(1, 2)
|
|
ok2 = ok2 + 1
|
|
}
|
|
// ## P2 out high, read from P0 and P1
|
|
pins.digitalWritePin(DigitalPin.P2, 1)
|
|
basic.pause(TESTSPEED)
|
|
p0 = pins.digitalReadPin(DigitalPin.P0)
|
|
p1 = pins.digitalReadPin(DigitalPin.P1)
|
|
if (p0 == 1) {
|
|
led.plot(2, 2)
|
|
ok2 = ok2 + 1
|
|
}
|
|
if (p1 == 1) {
|
|
led.plot(3, 2)
|
|
ok2 = ok2 + 1
|
|
}
|
|
p2 = pins.digitalReadPin(DigitalPin.P2)
|
|
// ## Assess final test status
|
|
if (ok0 == 4) {
|
|
led.plot(4, 0)
|
|
}
|
|
basic.pause(TESTSPEED)
|
|
if (ok1 == 4) {
|
|
led.plot(4, 1)
|
|
}
|
|
basic.pause(TESTSPEED)
|
|
if (ok2 == 4) {
|
|
led.plot(4, 2)
|
|
}
|
|
basic.pause(TESTSPEED)
|
|
if (ok0 + ok1 + ok2 == 12) {
|
|
// all tests passed
|
|
led.plot(4, 4)
|
|
}
|
|
// ## Test cycle finished
|
|
basic.pause(1000)
|
|
}
|
|
// intentionally don't clear A and B flags, so main loop can process them.
|
|
}
|
|
|
|
/**
|
|
* - show number of dots on screen (0..25) to represent temperature in celcius
|
|
*/
|
|
function testTemperature() {
|
|
while (!AWasPressed && !BWasPressed) {
|
|
let temp = input.temperature() - 10
|
|
temp = Math.clamp(0, 25, temp)
|
|
dots025.plotFrame(temp)
|
|
basic.pause(500)
|
|
}
|
|
}
|
|
|
|
function testButtonB() {
|
|
basic.plotLeds(`
|
|
. # # . .
|
|
. # . # .
|
|
. # # . .
|
|
. # . # .
|
|
. # # . .
|
|
`)
|
|
// wait for B pressed
|
|
while (!input.buttonIsPressed(Button.B)) {
|
|
basic.pause(100)
|
|
}
|
|
basic.plotLeds(`
|
|
. . # # .
|
|
. . # . #
|
|
. . # # .
|
|
. . # . #
|
|
. . # # .
|
|
`)
|
|
// wait for B released
|
|
while (input.buttonIsPressed(Button.B)) {
|
|
basic.pause(100)
|
|
}
|
|
basic.plotLeds(`
|
|
. # # . .
|
|
. # . # .
|
|
. # # . .
|
|
. # . # .
|
|
. # # . .
|
|
`)
|
|
basic.pause(1000)
|
|
}
|
|
|
|
function testTiltY() {
|
|
basic.clearScreen()
|
|
let prevy = 0
|
|
while (!AWasPressed && !BWasPressed) {
|
|
basic.pause(100)
|
|
let y = input.acceleration(Dimension.Y)
|
|
let y2 = y / 512 + 2
|
|
let y3 = Math.clamp(0, 4, y2)
|
|
// sticky trace
|
|
led.plot(0, y3)
|
|
// middle line is actual/live
|
|
if (y3 != prevy) {
|
|
led.unplot(2, prevy)
|
|
prevy = y3
|
|
}
|
|
led.plot(2, y3)
|
|
// bottom line is -4G, -2G, 1G, +2G, +4G
|
|
if (y <= -2048) {
|
|
led.plot(4, 0)
|
|
} else if (y <= -1024) {
|
|
led.plot(4, 1)
|
|
} else if (y <= 1024) {
|
|
led.plot(4, 2)
|
|
} else if (y <= 2048) {
|
|
led.plot(4, 3)
|
|
} else {
|
|
led.plot(4, 4)
|
|
}
|
|
}
|
|
}
|
|
|
|
function testTiltZ() {
|
|
basic.clearScreen()
|
|
while (!AWasPressed && !BWasPressed) {
|
|
let z = input.acceleration(Dimension.Z)
|
|
if (z < -2000) {
|
|
basic.plotLeds(`
|
|
# . . . #
|
|
# . . . #
|
|
# . . . #
|
|
# . . . #
|
|
# . . . #
|
|
`)
|
|
} else if (z <= -1030) {
|
|
basic.plotLeds(`
|
|
. # . # .
|
|
. # . # .
|
|
. # . # .
|
|
. # . # .
|
|
. # . # .
|
|
`)
|
|
} else if (z <= 1000) {
|
|
basic.plotLeds(`
|
|
. . # . .
|
|
. . # . .
|
|
. . # . .
|
|
. . # . .
|
|
. . # . .
|
|
`)
|
|
} else if (z <= 1030) {
|
|
basic.plotLeds(`
|
|
. . . . .
|
|
. . . . .
|
|
# # # # #
|
|
. . . . .
|
|
. . . . .
|
|
`)
|
|
} else if (z <= 2000) {
|
|
basic.plotLeds(`
|
|
. . . . .
|
|
# # # # #
|
|
. . . . .
|
|
# # # # #
|
|
. . . . .
|
|
`)
|
|
} else {
|
|
basic.plotLeds(`
|
|
# # # # #
|
|
. . . . .
|
|
. . . . .
|
|
. . . . .
|
|
# # # # #
|
|
`)
|
|
}
|
|
basic.pause(100)
|
|
}
|
|
}
|
|
|
|
function startIOMonitor() {
|
|
input.input.onButtonEvent(Button.A, ButtonEvent.Click, () => {
|
|
AWasPressed = true
|
|
})
|
|
input.input.onButtonEvent(Button.B, ButtonEvent.Click, () => {
|
|
BWasPressed = true
|
|
})
|
|
input.onShake(() => {
|
|
wasShake = true
|
|
})
|
|
}
|