Published using Google Docs
( EPC4.2.fth )
Updated automatically every 5 minutes

TACHYON

[~

FORGET EPC.fth

3 STOP

pub EPC.fth            ." Ecohousing Process Controller   V4.2 140620-0000 " ;

{ updated version using SPI etc

webpage version

}

( EPC SYSTEM BLOCK DIAGRAM )

( CE0810 I/O Connections )

( ***** HARDWARE DEPENDANT DEFINITIONS ***** )

#P23          |< == @rst1                \ Reset lines to C8051 micros - removed for EPC work

#P25          |< == @rst0

#P11        |< == @valve                \ drives MOSFET

#P12        |< == @top                        \

#P13        |< == @bottom

#P14        |< == @pressure

@top @bottom + @pressure + == inputpins

\ #P6        |< == RXDKEY            \ Serial receive data from keypad ( connected to PIXIE instead )

\ RS485 COMS - not used - I/O used on module

#P14        == TXD422

#P12        == TE422

( RS485 coms to VGA PIXIE monitors - rx and tx separated )

#P22        == RXD422

#P21        == TXD485

#P20        == TE485

\ The CE0810 is equipped with an I/O module that drives the pump solenoid and monitors inputs

( PIO4307 Schematic )

\ ***** APPLICATION CONSTANTS *****

#20        == #maxframes        \ frames used per system

\ *** TIMERS ***

TIMER =VALVE                    \ valve timer

TIMER =DISPLAY

TIMER =SCREEN

TIMER =RS485

LONG encoder

        BUFFERS ORG

        04 DS epccold

        04 DS entry                \ numeric entry

        04 DS entry2

        04 DS digits

        04 DS polls                \ counting polling

        01 DS autoent

         03 DS+

        04 DS autofnc

        04 DS step

        04 DS count            \ number of strokes required to pour

        04 DS restart

        04 DS stroke

        04 DS valve

        04 DS dpymode

        04 DS strokes

        04 DS encoder

        04 DS holdtime

         04 DS precharge

        04 DS epcflg

        04 DS xnum            \ x position of number entry

        04 DS ynum

        04 DS ewidth

\ pour#,time,date,start,<program>

        04 DS pour            \ pour number or order#

        04 DS start            \ start time of pour

        04 DS pourtime

        04 DS pourdate

#maxframes         DS steps            \ steps for XX machines

400d        == memsz

20d         == rcdsz            

memsz         DS memory            

pub ESAVE                ; \ epccold DUP $200 ESAVE ;

pub busy?             1 epcflg ;

pub .TIME             TIME@ L>W .BYTE ." :" W>B .BYTE DROP ;

\ Console messages - time stamped

pub MSG        CON CR runtime @ #100000 MOD DECIMAL <# # # # "." HOLD # # "@" HOLD #> PRINT$  ." : " ;

pub VALVE ( on/off -- )               @valve OUT ;

pub VALVE? ( -- flg )                        @valve IN ;

pub PRESSURE? ( -- flg )                @pressure INPUTS @pressure IN 0= @pressure OUTSET ;

pub TOP? ( -- flg )                    @top IN 0= ;

pub BOTTOM? ( -- flg )                @bottom IN 0= ;    

pub MONOUT ( ch -- )    

         DUP TXD485 SEROUT

         BL < IF 2 1 LED OUTLEDS 1 ms OFF 1 LED OUTLEDS THEN

         ;

\ 32 ch x 12 lines of 16x32 font = 384 chars

\ Divert output to serial port of remote PIXIEs

pub MON            ' MONOUT uemit W! ;

\ Set the BAUD rate for the RS485 network to the PIXIEs

CLKFREQ #115200 /            == BAUD485

\ Pulse the RS485 receiver input to release any WAITPNE instruction

pub RELEASE

         RXD422 MASK DUP OUTCLR INPUTS

         ;

pub SERIN485

        2 =RS485 TIMEOUT

        ' RELEASE =RS485 ALARM

         RXD422 MASK

         0 8 BAUD485 4TH WAITPNE

         DELTA FOR SHRINP WAITCNT NEXT

         WAITCNT

         #24 SHR NIP DUP $FF = IF DROP 0 THEN

        ;

pub MON@ ( -- ch )                \ Enquire if any screens have a keypad character to send

        5 TXD485 SEROUT                \ Send ENQ command to PIXIE

         TE485 PINCLR                \ then listen for a response (task)

        SERIN485

        TE485 PINSET                \ back to transmit mode

        ;

\ Setup serial port of monitors and clear their screens

pub !MON                   

         #115200 SERBAUD TE485 PINSET TXD485 PINCLR #200 ms TXD485 PINSET ( 4 seconds )

;

\ Color constants

$00                    == BLACK

$14                    == TEAL

$44                    == PINK

\ $D4                == CREAM PINK

$88                    == MAGENTA

$50                    == DRAB

$54                    == KAHKI

$58                    == LILAC

$60                    == LIME

\ $64                == GREEN CREAM

$70                    == CALYPSO

$D0                    == ORANGE

$0C                    == BLUE

$30                    == GREEN

$C0                    == RED

$54                    == GREY

$FC                    == WHITE

RED GREEN +            == YELLOW

GREEN BLUE +            == CYAN

\ Turn a bold color into a shade

pub SHADE ( col -- shade )            DUP %01010100 AND SWAP %10101000 AND 2/ OR ;

LONG colors

pub PEN ( color -- )                    MON $1D EMIT DUP EMIT CON 8 SHL colors @ $FF AND OR colors ! ;

pub PAPER ( color -- )                    colors @ $FF ANDN OR colors ! ;

pub PLOT ( x y -- )                            $1E EMIT SWAP EMIT EMIT ;

pub XSIZE ( xsize -- )                    MON $18 EMIT EMIT CON ;

pub YSIZE ( ysize -- )                   MON $19 EMIT EMIT CON ;

pub NORMAL                                1 1

pub SIZE ( x y -- )                            YSIZE XSIZE ;

pub .DIGITS ( num -- )                MON 0 MAX #99 MIN $20A .NUM CON ;

pub @X ( x -- )                            MON $10 EMIT EMIT ;

pub @Y ( y -- )                                   MON $11 EMIT EMIT ;

pub @XY ( x y -- )                            @Y @X ;

\ Position cursor at character X Y

pub CXY ( x y -- )                            4 SHL SWAP 3 SHL SWAP

pub COLORS ( fg bg -- col )                SWAP B>W ;

\ cval = rrggbbxxrrggbbxx  - tile cnt cval

pub TILES ( tile# cnt cval -- )        MON $1C EMIT ROT EMIT SWAP EMIT W>B EMIT EMIT CON ;

pub @TILE ( x y -- tile# )        4 SHL + ;

pub PAINT ( xtile ytile width height -- )

        3RD OVER ADO 4TH I @TILE 3RD colors @ TILES LOOP

        2DROP 2DROP

        ;

\ pub *SET                         #80 #36 5

pub @ENTRY                        #208 #176 5

\ position number entry on screen with autoenter enabled for digits (or 0 for manual)

pub SETNUM ( x y width -- )            DUP autoent C! ewidth C! ynum ! xnum ! ;

\ Characters used to represent "LED" indicators at bottom left of screen

" -*-T-BLH-V-5-6-7" 0 STRING mleds

pub MLED        ( val index -- )

        NORMAL DUP 4 SHL #176 @XY

        2* SWAP 0<> 1 AND + mleds + C@ EMIT

        CON

        ;

pub MLEDS

        BLACK PEN ORANGE PAPER 0 #11 5 1 PAINT

        VALVE? 4 MLED

        PRESSURE? 3 MLED

        TOP? 1 MLED

        BOTTOM? 2 MLED

        ;

pub STEP@                 step @ steps + C@ ;

pub STEP!                 step @ steps + C! ESAVE ;

pub RUNNING?           count @ 0<> ;

\ Display the current MACHINE number as very big digits

pub .MACHINE ( n -- )

        MSG ." MACHINE " DUP .DEC                                    \ Echo diagnostics to console

            YELLOW PEN BLACK PAPER 0 1 9 #10 PAINT                    \ paint tiles in machine number area x y xwidth ywidth

            9 #11 SIZE 0 0 @XY 1+ .DIGITS                            \ Large digits

        NORMAL PRESSURE? IF GREEN ELSE RED THEN                        \ Reflect pressure status in machine title

         PEN BLACK PAPER        

        0 #10 8 1 PAINT                                            \ paint tiles for title

            #50 #158 @XY ." MACHINE "                                    \ display title

         CON                                                            \ return I/O to console in case we run interactively

           ;

BYTE lastcount

pub .COUNT ( n -- )

        DUP lastcount C@ = IF DROP EXIT THEN                        \ don't bother updating if there is no change

        DUP lastcount C!                                                        \ update change variable

        MSG ." COUNT " DUP .DEC                                                \ diagnostic

            GREEN PEN BLACK PAPER

            9 6 7 4 PAINT

            6 5 SIZE                                                                \ Set medium sized digits

            #142 #88 @XY .DIGITS

         NORMAL WHITE PEN BLUE PAPER 9 #10 7 1 PAINT                \ setup title block

             #162 #160 @XY ."   COUNT"                                         \ set title

         CON

            ;

BYTE dpymode

pub .HOLD

        =VALVE @ 1000d / 1+ .COUNT

          dpymode C@ "H" = IF EXIT THEN                                \ don't redraw if it's already drawn

         MSG ." HOLD "

        WHITE PEN RED PAPER 9 1 7 5 PAINT

         6 5 SIZE #142 8 @XY 2 SPACES CON                            \ erase digits

         "H" dpymode C!

         2 4 SIZE

         #146 #24 @XY ."  HOLD"

        CON

         ;

pub .STROKE ( n -- )

        MSG ." STROKE " DUP .DEC

         dpymode C@ "D" <>

           IF "D" dpymode C! 3 5 SIZE #146 #16 @XY 4 SPACES THEN

         DUP IF CYAN ELSE GREY THEN PEN

         BLACK PAPER 9 1 7 4 PAINT

        6 5 SIZE

         #142 8 @XY .DIGITS

         NORMAL WHITE PEN BLUE PAPER 9 5 7 1 PAINT

         #162 #80 @XY ."  STROKE" CON

         ;

\ Position display at step entry

pub @STEP ( step -- )

         NORMAL #128         ( step 128 )                                  \ xpos of 1st column program list

         OVER #maxframes 2/ =>

           IF SWAP #maxframes 2/ - SWAP #56 + ( step ypos ) THEN                \ use right column

         SWAP 4 SHL ( y spacing ) 16 + @XY                             \ top offset

         ;

\ Display step entry along with highlighting if selected

pub DisplayStep ( step -- )

         DUP @STEP                                            \ position display at step area

        MON ."  #"  DUP 1+ $20A .NUM                                \ display machine number

         ." ="  DUP steps + C@ $20A .NUM                                \ display contents of current step

            WHITE PEN  DUP step C@ = IF RED SHADE ELSE BLUE SHADE THEN PAPER         \ HIGHLIGHT if selected

        8 OVER #maxframes 2/ =>

           IF 4 + SWAP #maxframes 2/ - SWAP THEN

         SWAP 1+ 4 1 PAINT

         ;

pub .STEP

        RUNNING?

        IF STEP@ .COUNT step @ .MACHINE

        ELSE step @ DisplayStep

        THEN

        CON

        ;

pub DATA.DISPLAY

        dpymode C@ "D" <> IF .STEP 0 "D" dpymode C! THEN

        RUNNING?

        IF encoder @ stroke @ <>                    \ update only on change

           IF encoder @ DUP stroke ! .STROKE THEN        \ display the current stroke

\           .MACHINE.TITLE

        THEN

        ;

TABLE encstk        #64 ALLOT

BYTE inputs

\ for non-latching unipolar hall effect devices A1126

pub ENCODER.TASK

        encoder ~ 3

        BEGIN

            DUP inputs C!                                \ update global variable for application to sense inputs

            @top IN NOT IF 4 OR DUP 1 AND @bottom IN AND IF encoder ++ 1 ANDN 2 OR THEN ELSE 4 ANDN THEN

            @bottom IN NOT IF 8 OR DUP 2 AND @top IN AND IF encoder ++ 2 ANDN 1 OR THEN ELSE 8 ANDN THEN

\            @pressure IN NOT IF $10 OR ELSE $10 ANDN THEN

        AGAIN

        ;

}

{                OPERATION

 *********** SEQUENCE DESCRIPTION ************

 ENTER STEP AND PRESS START

 WHEN PRESSURE DROPS WAIT A BIT AND THEN

        1. ENGAGE VALVE

 WHEN STROKE COUNTER REACHES CURRENT STEP COUNT THEN:

        1. RELEASE VALVE

        2. ADVANCE STEP

        3. IF STEP = 0 THEN SKIP STEPS UNTIL <>0 or END

        4. STOP & ENTER PROGRAM MODE

        5. RESET STROKE COUNTER

        6. HOLD TIMEOUT

}

( ********************* KEYPAD ****************** )

pub !LCD            ;

\ Use 16 characters at the bottom of the screen for messages

pub @LCD ( x y -- )        #80 #176 @XY ;

pub SETENT                    STEP@ entry ! ;

pub STEP+                     step @ 1+

pub STEPCNT!                DUP 0< IF #maxframes + THEN #maxframes MOD step ! ;

pub STEP- ( -- )                step @ 1- STEPCNT! ;

pub .STEP+                    step @ 1- #maxframes MOD DisplayStep step @ DisplayStep ;

pub .STEP- ( -- )                step @ 1+ #maxframes MOD DisplayStep step @ DisplayStep ;

pub .ERROR                     @LCD ."         *ERROR!*        " ;

pub FUNC

pub PUSH                     entry @ entry2 ! ;

pub CLRENT                 entry ~ digits ~ ;

pub CLEAR                 CLRENT @ENTRY autofnc ~ !LCD encoder ~

pub .ENTRY                 RED PEN WHITE PAPER #13 #11 3 1 PAINT xnum @ ynum @ @XY 1 YSIZE

pub ENTRY                    MON entry @ ewidth C@ 8 SHL #10 + .NUM CON ;

pub [CLEAR]                 CLRENT  .ENTRY entry @ STEP! .STEP @LCD 16 SPACES ;

pub [CE]                     digits C@ IF entry @ #10 / entry ! digits C-- .ENTRY THEN ;

pub [ENTER]

        digits C@

          IF

          entry @ #120 <

            IF entry @ STEP! .STEP CLRENT

            ELSE .ERROR CLRENT EXIT

            THEN

          THEN

        CLRENT .ENTRY STEP+ .STEP+ SETENT

        ;

pub STROKES.SET

        SETENT

        2 autoent C!

        ;

\ ********************* DISPLAY *****************

pub LIST_STATS ;

pub EPC.BUSY            60000d =SCREEN TIMEOUT busy? CLR ;

pub EPC.IDLE            busy? SET ( CLRSCR LOGO LIST_STATS ) ;

pub LIST.CLR

        BLACK PEN            \ erase the list area

        ;

pub .ASTIME

         DECIMAL <# # # ":" HOLD # # #> PRINT$

        ;

pub .POUR

            NORMAL 0 0 @XY

        ." #" pour @ $30A .NUM

            SPACE ." @" pourtime @ .ASTIME

            CON

            ;

pub [INC] ( inc step )                STEP@ 1+ STEP! .STEP ;

pub [DEC] ( dec step )                STEP@ 1- STEP! .STEP ;

pub LIST_PROGRAM

        .POUR

        WHITE PEN BLUE SHADE PAPER

        8 1 8 #10 PAINT    

        #128 0 @XY ."  MACHINES"

        #maxframes 0 DO I DisplayStep LOOP CON

        ;

pub CLRSCR        MON CLS CON ;

pub LOGO

        YELLOW PEN GREEN SHADE PAPER

        0 1 8 2 PAINT

        WHITE SHADE PEN BLACK PAPER

        0 3 8 2 PAINT

        \          1234567890123456

        NORMAL 2 YSIZE 0 #14 @XY

            ."   Ecohousing "

        1 YSIZE 0 #48 @XY

             ."  Proportioner"

        CR  ."   Controller "

        CON

        ;

\ Fill the main display block

pub MAIN.FILL ( col -- )

        WHITE SWAP COLORS

        5 6 ADO 0 I @TILE 8 3RD TILES LOOP DROP

        ;

pub ALERT ( col -- )

        MAIN.FILL

        3 6 SIZE

        16 #80 @XY

        ;

pub *STOP*

         CLRSCR

         RED ALERT

         WHITE PEN RED PAPER

         MON ." STOP"

         LOGO

         ;

\ Change display to EDIT mode

pub EDIT

        *STOP*

        stroke @ restart !

        count ~

        OFF VALVE

        LIST_PROGRAM

        STROKES.SET

        LIST_STATS

        ;

pub [STOP]

        MSG ." Stopped "

        EDIT

        @LCD ." Stopped at " .TIME

        CON

        ;

\ pour#,time,date,start,<program>

pub NEXT-POUR

        memory DUP rcdsz + memsz rcdsz - CMOVE                \ make room for new entry by pushing in

        pour memory rcdsz CMOVE                           \ save current pour

        pour ++                                                 \ increment pour count

        start ~

        ESAVE

        ;

pub +MACHINE ( Step to next machine in run sequence and holdoff valve)

        BEGIN

          STEP+ step @ 0=                            \ stop if there are no more machines (back to 0)

            IF NEXT-POUR [STOP] EXIT THEN

          STEP@ 0<>

        UNTIL

        STEP@ count !

        .STEP

        holdtime @ =VALVE TIMEOUT                        \ 8 second valve timeout

        ;

pub ?STROKE ( Process the stroke counter)

        RUNNING?

          IF

            EPC.BUSY                                        \ Hold off screensaver

          encoder @ 1+ count @ >                       \ terminate?

            IF OFF VALVE +MACHINE                        \ turn off the high pressure valve etc

            THEN

          THEN

        ;

\ Turn on full pressure valve if required

pub ?VALVE

        =VALVE TIMEOUT?                                \ ignore while timing out

        IF

            RUNNING?

            PRESSURE? NOT AND                            \ and no pressure ?

              IF ON VALVE THEN

        ELSE                                                        \ on HOLD - timing out for next machine

            encoder ~                                        \ Don't allow encoder pulses while timing out

            -1 stroke !

           holdtime @ 2/ precharge @ 0 MAX MIN precharge !  \ is precharge is short enough

           =VALVE @ precharge @ U<                         \ precharge line just before it times out

           IF

              PRESSURE? NOT AND                            \ and no pressure ?

                IF ON VALVE THEN

           THEN

        THEN

        ;

\ This is just a little demo and not used in this application

pub BIGCLOCK

MON CLS

YELLOW PEN BLACK PAPER 0 0 #16 #12 PAINT

        6 XSIZE #12 YSIZE 0 0 @XY .TIME

        CON

        ;

pub BIGNUM ( num -- )

MON CLS

YELLOW PEN BLACK PAPER 0 0 #16 #12 PAINT

        6 XSIZE #12 YSIZE 0 0 @XY .DEC

        CON

        ;

pub SHOW.TIME            #216 0 @XY .TIME ;

\ Poll the display for updates etc

pub ?DISPLAY

        =DISPLAY TIMEOUT?

         IF

             #250 =DISPLAY TIMEOUT

             SHOW.TIME

             epcflg 1+ C++

             epcflg 1+ C@ 3 AND

             " |/-\" + C@  

             mleds 1+ C! ON 0 MLED

             CON

             =VALVE TIMEOUT?

                 IF DATA.DISPLAY ELSE .HOLD THEN

         THEN

          MLEDS

   

         epcflg 1+ C@ 3 AND 2 LED

         VALVE? 1 AND 1+ 4 LED

         PRESSURE? 1 AND 1+ 5 LED

         @top IN 0= 2 AND 7 LED

         @bottom IN 0= 2 AND 6 LED

         OUTLEDS    

        ;

pub START

        MSG ." Process started "

        MON CLS

        -1 stroke !                \ enable screen refresh for stroke

        .STEP

        time @ pourtime ! date @ pourdate !

        time @ start !

        LIST_STATS

        .POUR

        @LCD ." Started at " .TIME

        ;

pub [START]

        MSG ." Start requested"

        encoder ~

        0 #maxframes 0 DO I steps + C@ IF DROP I LEAVE THEN LOOP            \ find next active entry

        step !

        STEP@ ?DUP

          IF count !

          START

        ELSE

        [STOP]

        @LCD ." Empty program   "

          THEN

        CON

        ;

pub [HOLD]        \ *** START/HOLD ***

        RUNNING? IF [STOP] ELSE -1 lastcount C! [START] THEN

        ;

\ pour#,time,date,<program>

pub RECALL

         entry @ CLRENT

         memsz rcdsz / 0

            DO I rcdsz * memory + @ OVER =

                IF DROP I rcdsz * memory + pour rcdsz CMOVE THEN

            LOOP

            LIST.CLR

          LIST_PROGRAM

          ;

( ***** KEYPAD TASK ***** )

{ The keypad used is a modified USB keypad which was supposed to be PS/2 compatible but this was not the case and since PS/2 keypads are hard to come by it was decided to modify these ones instead. Since we now have full control over the keys, codes, and interface it was changed to a simple 9600 baud serial send only. All keys including the NUM LOCK output a single ASCII code corresponding to their key label. In this implementation the keypads plug into the PIXIE which runs the monitor and so any keys that pressed are sent back over the RS485 bus in a simple multi-station mode.

}

LONG key

pub KEY@ ( -- byte )        

         MON@ DUP IF key @ 8 SHL OVER + key ! THEN

;

pub [DIGIT] ( n -- )

        @ENTRY NORMAL

        $0F AND

        digits C@ 0= IF CLRENT @LCD 16 SPACES THEN

        digits C@ 5 <

        IF entry @ 0A * + entry ! digits C++ .ENTRY

           digits C@ autoent C@ => IF [ENTER] THEN

        ELSE DROP

        THEN

        ;

pub [RECALL]

         digits C@

         IF

             @LCD ." Recall pour #" entry @ $30A .NUM

             RECALL

         ELSE

             key 1+ C@ "*" =

             IF

                 steps #maxframes ERASE LIST_PROGRAM

                @LCD ." Program cleared "

             ELSE

\                   1234567890123456

                @LCD ." Next press wipes"

             THEN

         THEN

        ;

pub [STEP+]            step @ STEP+ DisplayStep .STEP+ STROKES.SET ;

pub [STEP-]            step @ STEP- DisplayStep .STEP- STROKES.SET ;

pub [STEP0]            step @ step ~ DisplayStep step @ DisplayStep STROKES.SET ;

pub SETTIME    

digits C@ 4 = entry @ #0500 #2400 WITHIN AND

  IF entry @ #100 * TIME! THEN

@LCD ."  Set time " .TIME 2 SPACES

CLRENT .ENTRY

CON

;

pub SETPRECH

        entry @ #1000 * 0 holdtime @ 2/ WITHIN IF entry @ #1000 * precharge ! ESAVE THEN

        @LCD ." Precharge = " precharge @ #1000 U/ .DEC CLRENT

        ;

pub SETHOLD

        entry @ 1 #60 WITHIN IF entry @ #1000 * holdtime ! ESAVE THEN

        @LCD ." Hold time = " entry @ .DEC CLRENT

        ;

pub [SET]

        digits C@ SWITCH

        1 CASE SETHOLD BREAK

        2 CASE SETHOLD BREAK

         3 CASE SETPRECH BREAK

         4 CASE SETTIME BREAK

        ;

pub RUNKEYS:

        [STOP]

{

        SWITCH

        BL CASE encoder C++ BREAK

        "[" CASE OFF VALVE BREAK

        "]" CASE ON VALVE BREAK

        [STOP]

}

        ;

( KEYPAD LAYOUT )

pub [KEYPAD]

         >B SWITCH

          ^[         CASE step ~ [HOLD]  BREAK                    \ HOLD START/STOP

         "/"        CASE [SET] BREAK

         "*"        CASE [RECALL] BREAK    

         "-"        CASE [STEP-] BREAK                            \ step down

         "+"        CASE [STEP+] BREAK                            \ step up

        ^H        CASE [CE] BREAK                                \ clear entry

         ^M         CASE [ENTER] LIST_STATS BREAK

 

        "."        CASE [CLEAR] BREAK

         BL         CASE [STEP0] BREAK

         

        SWITCH@ "0" "9" WITHIN IF SWITCH@ [DIGIT] BREAK            \ 0..9 numeric key

         ;

pub ?KEYPAD

        KEY@ ?DUP

        IF

            MSG ." KEY=" DUP .BYTE SPACE DUP BL > IF DUP EMIT THEN

          RUNNING?                                            \ Special keys during RUN (normally stops)

            IF

              RUNKEYS:

            ELSE

              =SCREEN TIMEOUT? IF EDIT THEN

              EPC.BUSY

              [KEYPAD]

            THEN

        THEN

        ;

pub ?EPC

        polls ++

        polls @  3 AND 0= IF 1 ms ?KEYPAD THEN

        ?STROKE

        ?VALVE

        ?DISPLAY

        CON

        ;

pub DEFAULTS

        pour memsz rcdsz + ERASE

        pour ~

        #8000 holdtime !                \ 8 second timeout

         #2000 precharge !

        $A55A5AA5 epccold !

        ESAVE

        ;

   

   

pub ?DEFAULTS

        epccold @ $A55A5AA5 <>

          IF DEFAULTS THEN

         step ~

         ;

pub !HW

        epcflg ~

        polls ~

        -1 lastcount C!

        ?DEFAULTS

        @rst0 OUTCLR @rst1 OUTCLR

        !LCD SETENT

        CLRSCR

        CLEAR

        #50 ms

        ;

BYTE escs

pub ESCS?

         KEY ?DUP IF $1B = IF escs C++ ELSE escs C~ THEN ELSE DROP THEN escs C@ 2 >

        ;

LONG epc

pub EPCTASK ( Ecohousing Pour Controller Task - monitors strokes,valve,keypad,timers,etc)

        0 LED! escs C~ EPC.BUSY

        BEGIN

           !SP

             ?EPC

           epc ++

             ESCS?

        UNTIL

        CON

        ;

pub !EPC

        !MON ( need to eait 4 seconds for full boot )

         \ LED test - take a few seconds here as we have to wait for the monitors to reboot

         4 FOR $666666 LED! #250 ms $999999 LED! #250 ms NEXT            \ alternate red and green LEDs

        #24 0 DO I MASK LED! #100 ms LOOP                        \ Light LEDs as green and red individually

        0 #48 @XY EPC.fth #1000 ms

        WHITE PEN BLUE PAPER 0 1 16 #10 PAINT

         BLUE PEN WHITE PAPER 0 0 16 1 PAINT

         GREEN PEN BLACK PAPER 0 #11 16 1 PAINT

        MSG ." Initialising EPC"

         #50 ms

         !HW

         MSG ." [STOP] executed"

         [STOP]

        ' ENCODER.TASK 3 RUN

        ;

pub EPC ( Ecohousing Pour Controller & Operator Display - www.ecohousing.com.au )

        !SP !PCB !EPC

         EPCTASK

         CON

          ;

pub GO        EPC ;

pub RESUME        EDIT EPCTASK ;

{         PRODUCTION NOTES:

First version used latching hall effect devices

Remove all components from bottom side of CE0810

Change IO15..12 resnet to 100K (20V inputs)

Use 220R for IO11..8

NAMES:  $56A6...74DB for 7733 (1900 bytes added)

CODE:   $0000...4047 for 8722 (3767 bytes added)

CALLS:  0295 vectors free

RAM:        5727 bytes free

}

]~    

END

AUTORUN EPC

?BACKUP