// // Flashing Led Technology... // A simple LED sequencer for the Raspbery Ladder board that // puts a "mimic" display on the screen at the same time // numLEDs = 8 // Big LEDs PROC ladderSetup PROC setup // // Read and decode our data // CYCLE RESTORE CYCLE READ l, s, d IF l = -1 THEN BREAK PROC led(l, s) IF DigitalRead (buttonA) = 0 THEN d = d / 10 IF d <> 0 THEN WAIT (d / 100) // IF DigitalRead (buttonB) = 0 THEN PROC led(gMan, 1) ELSE PROC led(gMan, 0) ENDIF // IF DigitalRead (buttonC) = 0 THEN PROC led(rMan, 1) ELSE PROC led(rMan, 0) ENDIF // IF DigitalRead (buttonD) = 0 THEN PROC tidyUp END ENDIF // UPDATE REPEAT REPEAT END // // PROC setup: // Clear the screen and put up the LEDs on the // screen to match those on the ladder board // DEF PROC setup LOCAL i HGR COLOUR = Green RECT (GWIDTH / 3, 0, GWIDTH / 3, GHEIGHT, TRUE) rdius0 = GHEIGHT / (numLEDs * 2) - 18 // Outer rdius1 = GHEIGHT / (numLEDs * 2) - 22 // Inner manRads0 = rdius0 * 3 / 5 manRads1 = rdius1 * 3 / 5 vStep = GHEIGHT / numLEDs vOff = vStep / 2 hPos0 = GWIDTH / 2 // Horizontal middle of the screen hPos1 = hPos0 + (hPos0 / 4) FOR i = 0 TO numLEDs - 1 CYCLE PROC led(i, FALSE) REPEAT PROC led(8, FALSE) PROC led(9, FALSE) ENDPROC // // tidyUp: // Turn off all the LEDs and exit the program // DEF PROC tidyUp LOCAL i // First light everything FOR i = 0 TO 9 CYCLE PROC led(i, 1) REPEAT UPDATE WHILE DigitalRead (buttonD) = 0 CYCLE REPEAT // FOR i = 0 TO 9 CYCLE PROC led(i, 0) REPEAT UPDATE ENDPROC // // PROC led: // Turn an LED on or off on both the screen and // ladder board. // DEF PROC led(led, state) // // Ladder board (easy) // DigitalWrite (led, state) // // Screen - harder // SWITCH (led) CASE 0, 1, 9 COLOUR = Red ENDCASE CASE 2, 3 COLOUR = Yellow ENDCASE CASE 4, 5, 8 COLOUR = Lime ENDCASE CASE 6, 7 COLOUR = Blue ENDCASE ENDSWITCH // IF led <= 7 THEN // // Big LEDs // CIRCLE (hPos0, GHEIGHT - (vStep * led + vOff), rdius0, TRUE) IF NOT state THEN // Turn it OFF COLOUR = Black CIRCLE (hPos0, GHEIGHT - (vStep * led + vOff), rdius1, TRUE) ENDIF ELSE // // Little LEDs // IF led = 8 THEN // Green Man CIRCLE (hPos1, GHEIGHT - (vStep * 2 + vOff), manRads0, TRUE) IF NOT state THEN // Turn it OFF COLOUR = Black CIRCLE (hPos1, GHEIGHT - (vStep * 2 + vOff), manRads1, TRUE) ENDIF ELSE // Red Man CIRCLE (hPos1, GHEIGHT - (vStep * 1 + vOff), manRads0, TRUE) IF NOT state THEN // Turn it OFF COLOUR = Black CIRCLE (hPos1, GHEIGHT - (vStep * 1 + vOff), manRads1, TRUE) ENDIF ENDIF ENDIF ENDPROC // // ladderSetup: // This is the setup procedure. We initialise the various // pins into the correct modes and extinbuish all the LEDs // DEF PROC ladderSetup LOCAL i FOR i = 0 TO 9 CYCLE PinMode (i, 1) // Output DigitalWrite (i, 0) // Off REPEAT FOR i = 10 TO 13 CYCLE PinMode (i, 0) // Input PullUpDn (i, 2) // Activate internal pull-up REPEAT // // Make some globals // // ledRed1 = 0 ledRed2 = 1 ledYellow1 = 2 ledYellow2 = 3 ledGreen1 = 4 ledGreen2 = 5 ledBlue1 = 6 ledBlue2 = 7 gMan = 8 rMan = 9 buttonA = 11 buttonB = 10 buttonC = 12 buttonD = 13 // ENDPROC // // LED Sequence data // Data is read in triplets: L,S,N where L is the LED (1-8), S is the state // 1 = on, 0 = off, and N is the delay time in 100th of seconds. // -1,-1,-1 is end of the sequence. // DATA 0, 1, 10 DATA 1, 1, 10 DATA 0, 0, 0, 2, 1, 10 DATA 1, 0, 0, 3, 1, 10 DATA 2, 0, 0, 4, 1, 10 DATA 3, 0, 0, 5, 1, 10 DATA 4, 0, 0, 6, 1, 10 DATA 5, 0, 0, 7, 1, 10 DATA 6, 0, 10 DATA 7, 0, 10 // DATA 7, 1, 10 DATA 6, 1, 10 DATA 7, 0, 0, 5, 1, 10 DATA 6, 0, 0, 4, 1, 10 DATA 5, 0, 0, 3, 1, 10 DATA 4, 0, 0, 2, 1, 10 DATA 3, 0, 0, 1, 1, 10 DATA 2, 0, 0, 0, 1, 10 DATA 1, 0, 10 DATA 0, 0, 10 // DATA -1, -1, -1