/*-----------------------------------------------------------------------
**
**	Hardware.h
**	
**  Hardware specific definitions.
** Many of the settings depend on the overall main clock frequency, which
** is 18MHz. This is set away from 20MHz to reduce interference from harmonics
** affecting the radio comms at 40MHz.
**
**---------------------------------------------------------------------*/

#ifndef HARDWARE_H
#define HARDWARE_H

#include "binary.h"
#include "ioh82148.h"
#include "inh8.h"
                                      

//--------------
//
// Radio port
//
//--------------
               
// Module control
#define RADIO_DATA                      P6DR.3
#define RADIO_CLK                       P6DR.4
#define RADIO_EN                        P6DR.5
#define RADIO_CD                        P6DR.0

// Channel select                       
#define RADIO_READ_UNITS                P9DDR = b00000000; P4DDR = b11111011; P4DR.7 = 1
#define RADIO_READ_DECADE               P9DDR = b00001000; P4DDR = b01111011; P9DR.3 = 1
                 
// UART registers
#define RADIO_CONTROL_REGISTER          SCI_SCR2
#define RADIO_TRANSMIT_REGISTER         SCI_TDR2
#define RADIO_RECEIVE_REGISTER          SCI_RDR2
#define RADIO_STATUS_REGISTER           SCI_SSR2

// UART definitions
#define SETUP_CARRIER_LOST_IRQ          ISCRH = b00010000;  \
                                        ISCRL = b00000000;  \
                                        ISR.6 = 0;          \
                                        IER.6 = 1
#define RADIO_COMMS_ERRORS              (RADIO_STATUS_REGISTER & b00111000)
#define CLEAR_RADIO_COMMS_ERRORS        RADIO_STATUS_REGISTER &= b11000111
#define RADIO_TRANSMIT_FLAG             RADIO_STATUS_REGISTER.7      /* TDRE */
#define RADIO_RECEIVE_FLAG              RADIO_STATUS_REGISTER.6      /* RDRF */
#define SETUP_RADIO_TRANSMIT            RADIO_CONTROL_REGISTER = b10100000
#define SETUP_RADIO_RECEIVE             RADIO_CONTROL_REGISTER = b01010000
#define ENABLE_RADIO_TRANSMIT           RADIO_CONTROL_REGISTER.5 = 1  /* TE */
#define INHIBIT_RADIO_TRANSMIT          RADIO_CONTROL_REGISTER.5 = 0
#define ENABLE_RADIO_RECEIVE            RADIO_CONTROL_REGISTER.4 = 1  /* RE */
#define INHIBIT_RADIO_RECEIVE           RADIO_CONTROL_REGISTER.4 = 0
#define ENABLE_RADIO_RECEIVE_ISR        RADIO_CONTROL_REGISTER.6 = 1  /* RIE */
#define INHIBIT_RADIO_RECEIVE_ISR       RADIO_CONTROL_REGISTER.6 = 0
#define ENABLE_RADIO_TRANSMIT_ISR       RADIO_CONTROL_REGISTER.7 = 1  /* TIE */
#define INHIBIT_RADIO_TRANSMIT_ISR      RADIO_CONTROL_REGISTER.7 = 0
       

//----------------
//
// Diagnostics
//
//----------------
                      
#define SETUP_DIAGNOSTIC_PORT           SCI_SMR1 = b01100000;   \
                                        SCI_BRR1 = 129          \
                                        SCI_SCR1 = b00110000;   \
                                        SCI_SSR1 = 0x00
#define ENABLE_DIAGNOSTIC_TRANSMIT_ISR  SCI_SCR1.7 = 1    /* TIE */
#define INHIBIT_DIAGNOSTIC_TRANSMIT_ISR SCI_SCR1.7 = 0  
#define ENABLE_DIAGNOSTIC_RECEIVE_ISR   SCI_SCR1.6 = 1    /* RIE */
#define INHIBIT_DIAGNOSTIC_RECEIVE_ISR  SCI_SCR1.6 = 0
#define DIAGNOSTIC_TRANSMIT_REGISTER    SCI_TDR1
#define DIAGNOSTIC_RECEIVE_REGISTER     SCI_RDR1
#define DIAGNOSTIC_TDRE_CLEAR           SCI_SSR1.7 = 0    /* TDRE */
#define DIAGNOSTIC_RDRF_CLEAR           SCI_SSR1.6 = 0    /* RDRF */
                                        

//----------------
//
// Power solenoid
//
//----------------

#define POWER_SOLENOID                  P6DR.1


//----------------
//
// Extension shift register
//
//----------------

#define SR_DATA                         P8DR.0
#define SR_CLOCK                        P8DR.1
#define SR_STROBE                       P8DR.2
#define SR_INPUT                        P8DDR = b00011110
#define SR_OUTPUT                       P8DDR = b00011111


//----------------
//
// Scheduler
// The FRC is used for a regular 100ms (exactly) interrupt to sequence
// motor speed & control, and timer 1 is used for the regular 10.012ms
// interrupt to control the main sequencer.
//
//----------------

#define CLEAR_FRC_COMPARE_FLAG          FRT_TCSR = b00000001
#define FREE_RUNNING_COUNTER_INIT       FRT_OCRA = 56250;        \
                                        FRT_TIER = b00001000;    \
                                        FRT_TCSR = b00000001;    \
                                        FRT_TCR  = b00000010

#define CLEAR_MAIN_SEQUENCER_FLAG       TM_TCSR1  = b00000000
#define MAIN_SEQUENCER_INIT             TM_TCNT1  = 0;           \
                                        TM_TCORA1 = 176;         \
                                        STCR      = b00000000;   \
                                        TM_TCR1   = b01000011;   \
                                        TM_TCSR1  = b00000000

//----------
//
// Motors
//
//----------

// Multiplexor
#define SELECT_MOTOR_CHANNEL(x)         P4DR &= b10001111; P4DR |= (x << 4)
#define WHEEL_SPEED_COUNTER             TM_TCNT0
#define WHEEL_SPEED_COUNTER_INIT        TM_TCR0  = b00000101;TM_TCSR0 = b00000000

// Motor PWM drives
#define FRONT_LEFT_PWM                  PWM_PWSL = b11100000; PWM_PWDR
#define FRONT_RIGHT_PWM                 PWM_PWSL = b11100001; PWM_PWDR
#define REAR_LEFT_PWM                   PWM_PWSL = b11100010; PWM_PWDR
#define REAR_RIGHT_PWM                  PWM_PWSL = b11100011; PWM_PWDR
#define FRONT_LEFT_MOTOR_DIRECTION      P3DR.0
#define FRONT_RIGHT_MOTOR_DIRECTION     P3DR.1
#define REAR_LEFT_MOTOR_DIRECTION       P3DR.2
#define REAR_RIGHT_MOTOR_DIRECTION      P3DR.3
#define INITIALISE_PWM                  PWM_PWSL  = b11100000;   \
                                        PWM_PCSR  = b00000110;   \
                                        PWM_P1DDR = b11111111;   \
                                        PWM_P2DDR = b11111111;   \
                                        PWM_PWOERA= b00111111;   \
                                        PWM_PWOERB= b00111111

//--------------
//
// Weapons
//
//--------------
                         
// Hammers
#define FRONT_HAMMER_PWM                PWM_PWSL = b11100100; PWM_PWDR
#define REAR_HAMMER_PWM                 PWM_PWSL = b11100101; PWM_PWDR
#define FRONT_HAMMER_MOTOR_DIRECTION    P3DR.4
#define REAR_HAMMER_MOTOR_DIRECTION     P3DR.5
#define FRONT_HAMMER_HOME_SOLENOID      P2DR.6
#define REAR_HAMMER_HOME_SOLENOID       P2DR.7
#define FRONT_HAMMER_INDEX_POSITION     P7PIN.5
#define REAR_HAMMER_INDEX_POSITION      P7PIN.6
         
// Flipper
#define FLIPPER_SOLENOID_VALVE_0        P1DR.6
#define FLIPPER_SOLENOID_VALVE_1        P1DR.7
#define FLIPPER_SOLENOID_VALVE_2        P3DR.6
#define FLIPPER_SOLENOID_VALVE_3        P3DR.7
#define FLIPPER_RETRACT_MOTOR_POS       P4DR.0
#define FLIPPER_RETRACT_MOTOR_NEG       P4DR.1
#define FLIPPER_INDEX_POSITION          P7PIN.4 
#define COMPRESSOR_POWER
           
// Spear
#define SPEAR_DRIVE_FORWARDS            P9DR.4
#define SPEAR_DRIVE_BACKWARDS           P9DR.5
#define SPEAR_FORWARD_INDEX             P6DR.6
#define SPEAR_BACKWARD_INDEX            P6DR.7
#define ENABLE_SPEAR_INTS               ISCRH.6 = 1; IER |= b11000000   // Active falling edge
#define DISABLE_SPEAR_INTS              IER &= b00111111


//--------------
//
// Lights                               
// Three phases: A, B, and C
//
//--------------
         
#define LED_A_COLOUR                    PWM_PWSL = b11101000; PWM_PWDR
#define LED_B_COLOUR                    PWM_PWSL = b11101001; PWM_PWDR
#define LED_C_COLOUR                    PWM_PWSL = b11101010; PWM_PWDR

#define LED_A_BRIGHTNESS                PWM_PWSL = b11101011; PWM_PWDR
#define LED_B_BRIGHTNESS                PWM_PWSL = b11101100; PWM_PWDR
#define LED_C_BRIGHTNESS                PWM_PWSL = b11101101; PWM_PWDR


//--------------
//
// Analog inputs
//
//--------------

#define MOTOR_CURRENT                   ADDRAH
#define RADIO_RSSI                      ADDRBH
#define COMPRESSOR_CURRENT              ADDRCH
#define BATTERY_CURRENT                 ADDRDH
   

//--------------
//
// Mercury switch
//
//--------------

#define WHICH_WAY_UP                    P7PIN.7

#endif