'@        Device  wdt_off
'Include "Modedefs.Bas"

DEFINE OSCCAL_1K 1
DEFINE OSC 4

 ' INTERRUPT SETTINGS
RBIF	VAR	INTCON.0	' PORTB[4..7] Change Interrupt Flag
RBIE	VAR	INTCON.3	' PORTB[4..7] Change Interrupt Enable
RBPU	VAR	OPTION_REG.7	' PortB pullups (1=disabled, 0=enabled)
GIE		VAR	INTCON.7	' Global interrupt enable/disable  	
 ' SWITCHED with btn io for new perf board
IOC = %00001001       ' Only PIN 0 (prev 2) interrupt is enabled

GIE= 0					' Turn OFF global interrupts
WHILE GIE=1:GIE=0:WEND			' And make sure they are off
RBPU=0					' Enable PortB Pullup Resistors
RBIE=1					' Enable PortB[4..7] interrupt 	

ADCON0 = 131 '7 '%10001110 
ADCON0.7 = 1 ' Right justify for 10-bit
ANSEL = %00000000 ' all gpio digital
CMCON= 7 '%00000111      ' comparators off

n_2400 CON 16780  ' baud mode for serin2 (2400-8-N-1 inverted)
n_9600 CON 16468  '  baud mode for serin2 (9600-8-N-1 inverted)
 
progBtn VAR gpio.2: TrisIO.2 = 1   ' ***SWITCHED with btn io for new perf board***
tx VAR gpio.1    : trisio.1 = 1
btn VAR gpio.0   : trisio.0 = 1
tilt VAR gpio.3  :  TrisIO.3=1	
TrisIO.4=0
testLED VAR gpio.5 : trisio.5 = 0 : testLED = 0     
   
   
tiltPrev VAR BYTE
tiltPrev = tilt
tiltcount VAR BYTE
tilttimer VAR WORD
tilttimer =0

keyListLen VAR BYTE
keyListLen = 6

keyToSend VAR BYTE
keyToSend = 1
keyToSend_r VAR BYTE
		

pBtn VAR BYTE
pBtn = 0
counter VAR WORD
counter = 0   
'inbyte var byte(4)  ' incoming string
i VAR BYTE
sleepCounter VAR WORD

ID VAR BYTE
ID = 4

transmitID VAR BYTE
transmitID = 0

sendNullOnce VAR BYTE

main:

    ' if the 'tilt' pin has changed since last checked..
    IF tilt <> tiltPrev THEN
        tiltcount = tiltcount + 1    ' increase tilt count..
        sleepCounter = 0    ' make sure pic doesn't fall asleep (sleep code not shown here)
              ' 'blast' the same RF 20 times to ensure the receiver captures the transmission.
              FOR i = 0 TO 20
                ' protocol:
                ' "B" -> special wait character on receiver's end.
                ' transmitID -> unique ID for this transmition, so reciever can identify if a tranmission belowns to the same 'blast'.
                ' tiltcount -> sends this twice so receiver can compare the data for error-checking.
                SEROUT2 tx, n_2400, ["B", transmitID, tiltcount,tiltcount]
                       ' during the 'blast', if the tilt has changed, increase tiltCount during the blast
                       ' note to self - a litte bug here.. the TX will receive an accumilated value instead of a count.
                        IF tilt <> tiltPrev THEN
                            tiltcount = tiltcount + 1  
                            transmitID = transmitID + 1
                            transmitID = transmitID//100
                        ENDIF
                        tiltPrev = tilt
              NEXT  
              
              ' set a new ID for the next transmission.
              transmitID = transmitID + 1
              transmitID = transmitID//100
              tiltcount = 0         
             
    ENDIF
    tiltPrev = tilt
    
    

        IF btn <> pBtn THEN
         counter = 0
         sleepCounter = 0
         pBtn = btn
         IF btn = 1 THEN        
            FOR i = 0 TO 20
            IF btn = 0 THEN 
             GOSUB main
            ENDIF
            keyToSend_r = keyToSend + 128
            SEROUT2 tx, n_2400, ["B", ID, keyToSend_r, keyToSend_r, "E"]
            'serout2 tx, n_2400, ["B0101"]
            NEXT
         ELSE 
            IF progBtn = 0 THEN
                 keyToSend = keyToSend + 1
                 keyToSend  = keyToSend//keyListLen
            ENDIF
            FOR i = 0 TO 10
            IF btn = 1 THEN   
             GOSUB main
            ENDIF
            SEROUT2 tx, n_2400, ["B",ID, keyToSend, keyToSend, "E"]
            'serout2 tx, n_2400, ["B0110"]  
            NEXT
         ENDIF

        ENDIF

    
    IF counter//101 = 0 THEN
        sleepCounter = 0 
        IF btn = 1 THEN
            'serout2 tx, n_2400, ["B", ID, "0", keyToSend]
            'serout2 tx, n_2400, ["B0101"]
            SEROUT2 tx, n_2400, ["B", ID, keyToSend_r, keyToSend_r, "E"]
        ELSE
        SEROUT2 tx, n_2400, ["B",ID, keyToSend, keyToSend, "E"]
            'serout2 tx, n_2400, ["B", ID, "1",keyToSend]  
            'serout2 tx, n_2400, ["B0110"]   
         ENDIF             
    ENDIF
    
    IF counter < 1000 THEN
        counter = counter + 1
    ENDIF 
    

    sleepCounter = sleepCounter +1
    IF sleepCounter > 1100 THEN
        sleepCounter = 0
        tiltcount = 0
       ' tilttimer = 0
        'testLED = 0   
        RBIF=0					' Clear the PORTB[4..7] interrupt flag
@       SLEEP 
    ENDIF

GOSUB main