direction commands updated to Up down RPM value

Dependencies:   MAX7219pot MCP23S17 mbed

Fork of POT_V_1_0 by Marine Electricals

Committer:
viewdeep51
Date:
Fri Jan 05 04:35:22 2018 +0000
Revision:
1:e116808d8b00
Parent:
0:ba33a62aea4e
Child:
3:ae45e29f5d4f
05/01/2018

Who changed what in which revision?

UserRevisionLine numberNew contents of line
viewdeep51 0:ba33a62aea4e 1 #include "mbed.h"
viewdeep51 0:ba33a62aea4e 2
viewdeep51 0:ba33a62aea4e 3 #include "mbed.h"
viewdeep51 0:ba33a62aea4e 4 #include "pot.h"
viewdeep51 0:ba33a62aea4e 5 #include "max7219.h"
viewdeep51 0:ba33a62aea4e 6 #include "MCP23S17.h"
viewdeep51 0:ba33a62aea4e 7
viewdeep51 0:ba33a62aea4e 8 using namespace std;
viewdeep51 0:ba33a62aea4e 9
viewdeep51 0:ba33a62aea4e 10 //------------------------------------
viewdeep51 0:ba33a62aea4e 11 // Hyperterminal configuration
viewdeep51 0:ba33a62aea4e 12 // 9600 bauds, 8-bit data, no parity
viewdeep51 0:ba33a62aea4e 13 //------------------------------------
viewdeep51 0:ba33a62aea4e 14 Serial UART(SERIAL_TX, SERIAL_RX);
viewdeep51 0:ba33a62aea4e 15
viewdeep51 0:ba33a62aea4e 16 //timer instances creation//
viewdeep51 0:ba33a62aea4e 17 Ticker pot_HB;
viewdeep51 0:ba33a62aea4e 18 Ticker HB_Ticker;
viewdeep51 0:ba33a62aea4e 19 Ticker flash_Ticker;
viewdeep51 0:ba33a62aea4e 20 Ticker R_A_Ticker;
viewdeep51 0:ba33a62aea4e 21 Ticker CMD_Ticker;
viewdeep51 0:ba33a62aea4e 22 Ticker disp_FLASH; //display blink
viewdeep51 0:ba33a62aea4e 23 Ticker DIR_Ticker;
viewdeep51 0:ba33a62aea4e 24
viewdeep51 0:ba33a62aea4e 25 //SPI instances creation//
viewdeep51 0:ba33a62aea4e 26 SPI _SPI2(SPI2_MOSI, SPI2_MISO, SPI2_SCK); //for displays max7219
viewdeep51 0:ba33a62aea4e 27 SPI _SPI3(SPI3_MOSI, SPI3_MISO, SPI3_SCK); //for keyscan mcp23s17
viewdeep51 0:ba33a62aea4e 28
viewdeep51 0:ba33a62aea4e 29
viewdeep51 0:ba33a62aea4e 30 //class object instances for key I/O expander and segment driver//
viewdeep51 0:ba33a62aea4e 31 MCP23S17 mcp23s17_1(1,_SPI3, SPI3_CS1,SPI3_RST); //class MCP23S17 object instance for mcp23s17 IC-1 key detection
viewdeep51 0:ba33a62aea4e 32 MCP23S17 mcp23s17_2(2,_SPI3, SPI3_CS2,SPI3_RST); //class MCP23S17 object instance for mcp23s17 IC-2 key detection
viewdeep51 0:ba33a62aea4e 33 Max7219 max7219(SPI2_MOSI, SPI2_MISO, SPI2_SCK,SPI2_CS1); //object instance for seven segment drivers
viewdeep51 0:ba33a62aea4e 34
viewdeep51 0:ba33a62aea4e 35 //interrupts definations
viewdeep51 0:ba33a62aea4e 36 InterruptIn int_A(INT_A); //8commands
viewdeep51 0:ba33a62aea4e 37 InterruptIn int_B(INT_B); //4 3commands+1ack
viewdeep51 0:ba33a62aea4e 38 InterruptIn int_C(INT_C); //4(3 controls(INC+,DEC-,TEST)+1 req) enbaled for all
viewdeep51 0:ba33a62aea4e 39
viewdeep51 0:ba33a62aea4e 40 //chip select definations for max7219 & mcp23s17 as digitalout pins//
viewdeep51 0:ba33a62aea4e 41 DigitalOut cs_disp1(SPI2_CS1);
viewdeep51 0:ba33a62aea4e 42 DigitalOut cs_disp2(SPI2_CS2); //max7219
viewdeep51 0:ba33a62aea4e 43 DigitalOut cs_key1(SPI3_CS1);
viewdeep51 0:ba33a62aea4e 44 DigitalOut cs_key2(SPI3_CS2); //mcp23s17
viewdeep51 0:ba33a62aea4e 45
viewdeep51 0:ba33a62aea4e 46 DigitalOut Drive_En(Tx_EN); //uart driver enable
viewdeep51 0:ba33a62aea4e 47
viewdeep51 0:ba33a62aea4e 48 //discrete outputs definations buzzer and hooter
viewdeep51 0:ba33a62aea4e 49 DigitalOut buzzer(BUZ);
viewdeep51 0:ba33a62aea4e 50 DigitalOut hooter(HTR);
viewdeep51 0:ba33a62aea4e 51
viewdeep51 0:ba33a62aea4e 52 int addr,req,ack,cmd,dir,last_cmd, send_ADDR, rcvd_ADDR, ach_S,ach_M,test_cnt,req_ADDR,ack_ADDR, err_ID, err_Status;
viewdeep51 0:ba33a62aea4e 53
viewdeep51 0:ba33a62aea4e 54 uint8_t digit_disp_1, digit_disp_2, digit_disp_3; //disp1 for new rpm, disp2 for current rpm, disp3 for rtc
viewdeep51 0:ba33a62aea4e 55
viewdeep51 0:ba33a62aea4e 56 float brightness;
viewdeep51 0:ba33a62aea4e 57
viewdeep51 0:ba33a62aea4e 58 uint8_t spi_error,no_pot_connected;
viewdeep51 0:ba33a62aea4e 59
viewdeep51 0:ba33a62aea4e 60 char pot_Addr,addr_ID,checksum;
viewdeep51 0:ba33a62aea4e 61
viewdeep51 0:ba33a62aea4e 62 float HB_timer;
viewdeep51 0:ba33a62aea4e 63
viewdeep51 0:ba33a62aea4e 64 bool spi_ERR,pot_Error,_disp_FLASH;
viewdeep51 0:ba33a62aea4e 65 bool RPM_cmd,DIR_cmd, RPM_cmd_ack, DIR_cmd_ack;
viewdeep51 0:ba33a62aea4e 66 bool HB_rcvd, HB_ack_rcvd, CMD_rcvd, CMD_ack_rcvd, REQ_rcvd, BROADCAST_rcvd, ACK_rcvd, rcvd_DIR;
viewdeep51 0:ba33a62aea4e 67 bool HB_send, CMD_send, BROADCAST_send, REQ_send, ACK_send, CMD_ack_send;
viewdeep51 0:ba33a62aea4e 68 bool test;
viewdeep51 0:ba33a62aea4e 69 bool CMD_key;
viewdeep51 0:ba33a62aea4e 70 bool switch_CH, pot_MCR_err, pot_ER_err, ACH_SW_over;
viewdeep51 0:ba33a62aea4e 71
viewdeep51 1:e116808d8b00 72 char *key; // = new char[RX_BUFFER_SIZE]; //memory allocation for Receive buffer
viewdeep51 1:e116808d8b00 73 char valid;
viewdeep51 0:ba33a62aea4e 74 int device_addr = -1;
viewdeep51 0:ba33a62aea4e 75
viewdeep51 1:e116808d8b00 76 char rx_buf[RX_BUFFER_SIZE+1];
viewdeep51 1:e116808d8b00 77 char tx_buf[TX_BUFFER_SIZE+1];
viewdeep51 1:e116808d8b00 78 char RTC_buffer[5] = {1,2,3,4,0};
viewdeep51 0:ba33a62aea4e 79
viewdeep51 1:e116808d8b00 80 DigitalOut LED_CMD(_CMD_ACK); //ack command in slave devices only
viewdeep51 1:e116808d8b00 81 DigitalOut LED_CTRL[2] = {_REQ,_ACK}; //control transfer
viewdeep51 1:e116808d8b00 82 DigitalOut LED_DIR[2] = {_AHEAD,_ASTERN}; //dir command
viewdeep51 1:e116808d8b00 83 DigitalOut LED_ACH[8] = {_WH,_BRDG,_MCR,_ER,_WP,_WS,_OPS,_ASP}; //active channels
viewdeep51 0:ba33a62aea4e 84
viewdeep51 1:e116808d8b00 85 //DigitalOut myled(PB_13); //for internal test LED1
viewdeep51 0:ba33a62aea4e 86
viewdeep51 1:e116808d8b00 87 PwmOut mypwm(_PWM);
viewdeep51 0:ba33a62aea4e 88
viewdeep51 0:ba33a62aea4e 89 uint8_t rpm_data[4] = {0,0,0,0}; //digits 0-3
viewdeep51 0:ba33a62aea4e 90 uint8_t last_entry[4] = {0,0,0,0}; //digits 0-3
viewdeep51 0:ba33a62aea4e 91
viewdeep51 0:ba33a62aea4e 92 struct _POT
viewdeep51 0:ba33a62aea4e 93 {
viewdeep51 0:ba33a62aea4e 94 int slave_ID;
viewdeep51 0:ba33a62aea4e 95 uint8_t err_cnt;
viewdeep51 0:ba33a62aea4e 96 bool c_err; //communication error
viewdeep51 0:ba33a62aea4e 97 };
viewdeep51 0:ba33a62aea4e 98 _POT* POT=NULL;
viewdeep51 0:ba33a62aea4e 99
viewdeep51 0:ba33a62aea4e 100 enum AddrID
viewdeep51 0:ba33a62aea4e 101 {
viewdeep51 0:ba33a62aea4e 102 pot_Master = 1,
viewdeep51 0:ba33a62aea4e 103 pot_Submaster,
viewdeep51 0:ba33a62aea4e 104 pot_Slave_MCR,
viewdeep51 0:ba33a62aea4e 105 pot_Slave_ER,
viewdeep51 0:ba33a62aea4e 106 pot_Listner_WP,
viewdeep51 0:ba33a62aea4e 107 pot_Listner_WS,
viewdeep51 0:ba33a62aea4e 108 pot_Listner_OPS,
viewdeep51 0:ba33a62aea4e 109 pot_Listner_ASP = 8
viewdeep51 0:ba33a62aea4e 110 };
viewdeep51 0:ba33a62aea4e 111
viewdeep51 1:e116808d8b00 112 enum LED_STATUS
viewdeep51 1:e116808d8b00 113 {
viewdeep51 1:e116808d8b00 114 OFF = 0,
viewdeep51 1:e116808d8b00 115 ON,
viewdeep51 1:e116808d8b00 116 _FLASH = 2
viewdeep51 1:e116808d8b00 117 };
viewdeep51 1:e116808d8b00 118 LED_STATUS led_cmd_ack[1]; //only in slave devices
viewdeep51 1:e116808d8b00 119 LED_STATUS led_ctrl[2];
viewdeep51 1:e116808d8b00 120 LED_STATUS led_dir[2];
viewdeep51 1:e116808d8b00 121 LED_STATUS led_ach[8];
viewdeep51 0:ba33a62aea4e 122
viewdeep51 0:ba33a62aea4e 123 enum KEY
viewdeep51 0:ba33a62aea4e 124 {
viewdeep51 0:ba33a62aea4e 125 ZERO = 0,
viewdeep51 0:ba33a62aea4e 126 ONE,
viewdeep51 0:ba33a62aea4e 127 TWO,
viewdeep51 0:ba33a62aea4e 128 THREE,
viewdeep51 0:ba33a62aea4e 129 FOUR,
viewdeep51 0:ba33a62aea4e 130 FIVE,
viewdeep51 0:ba33a62aea4e 131 SIX,
viewdeep51 0:ba33a62aea4e 132 SEVEN,
viewdeep51 0:ba33a62aea4e 133 EIGHT,
viewdeep51 0:ba33a62aea4e 134 NINE,
viewdeep51 0:ba33a62aea4e 135 FALSE0 = 10
viewdeep51 0:ba33a62aea4e 136 };
viewdeep51 0:ba33a62aea4e 137 enum KEY num_KEY;
viewdeep51 0:ba33a62aea4e 138
viewdeep51 0:ba33a62aea4e 139 enum CTRL
viewdeep51 0:ba33a62aea4e 140 {
viewdeep51 0:ba33a62aea4e 141 REQ_ = 1,
viewdeep51 0:ba33a62aea4e 142 ACK_ = 2,
viewdeep51 0:ba33a62aea4e 143 FALSE1= 3
viewdeep51 0:ba33a62aea4e 144
viewdeep51 0:ba33a62aea4e 145 };
viewdeep51 0:ba33a62aea4e 146 enum CTRL ctrl_KEY;
viewdeep51 0:ba33a62aea4e 147
viewdeep51 0:ba33a62aea4e 148 enum direction_KEY
viewdeep51 0:ba33a62aea4e 149 {
viewdeep51 0:ba33a62aea4e 150 AHEAD = 1,
viewdeep51 0:ba33a62aea4e 151 ASTERN,
viewdeep51 0:ba33a62aea4e 152 FALSE2 = 3
viewdeep51 0:ba33a62aea4e 153 };
viewdeep51 0:ba33a62aea4e 154 enum direction_KEY dir_KEY;
viewdeep51 0:ba33a62aea4e 155
viewdeep51 0:ba33a62aea4e 156 enum display_KEY
viewdeep51 0:ba33a62aea4e 157 {
viewdeep51 0:ba33a62aea4e 158 clr_ENTRY = 0, //CE
viewdeep51 0:ba33a62aea4e 159 last_ENTRY, //C
viewdeep51 0:ba33a62aea4e 160 ENTER_ACK, //enter in case of master and ACK in case of slaves/repeaters
viewdeep51 0:ba33a62aea4e 161 FALSE3 = 3
viewdeep51 0:ba33a62aea4e 162 };
viewdeep51 0:ba33a62aea4e 163 enum display_KEY disp_KEY;
viewdeep51 0:ba33a62aea4e 164
viewdeep51 0:ba33a62aea4e 165 enum SET
viewdeep51 0:ba33a62aea4e 166 {
viewdeep51 0:ba33a62aea4e 167 INC=0,
viewdeep51 0:ba33a62aea4e 168 DEC,
viewdeep51 0:ba33a62aea4e 169 TEST,
viewdeep51 0:ba33a62aea4e 170 FALSE4 = 4
viewdeep51 0:ba33a62aea4e 171 };
viewdeep51 0:ba33a62aea4e 172 enum SET set_KEY;
viewdeep51 0:ba33a62aea4e 173
viewdeep51 0:ba33a62aea4e 174 enum CHANNEL
viewdeep51 0:ba33a62aea4e 175 {
viewdeep51 0:ba33a62aea4e 176 ch_A=1,
viewdeep51 0:ba33a62aea4e 177 ch_B,
viewdeep51 0:ba33a62aea4e 178 ch_C,
viewdeep51 0:ba33a62aea4e 179 ch_D=4
viewdeep51 0:ba33a62aea4e 180 }; //keyscan channelA,B,C,Dof MCP23s17 1& 2 respectively
viewdeep51 0:ba33a62aea4e 181 enum CHANNEL ch;
viewdeep51 0:ba33a62aea4e 182
viewdeep51 0:ba33a62aea4e 183 enum ack_dir_rpm
viewdeep51 0:ba33a62aea4e 184 {
viewdeep51 0:ba33a62aea4e 185 _RPM = 1,
viewdeep51 0:ba33a62aea4e 186 _DIR = 2
viewdeep51 0:ba33a62aea4e 187 };
viewdeep51 0:ba33a62aea4e 188
viewdeep51 0:ba33a62aea4e 189 /**************************************************************************************
viewdeep51 0:ba33a62aea4e 190 EOT display update FUNCTIONS
viewdeep51 0:ba33a62aea4e 191 **************************************************************************************/
viewdeep51 0:ba33a62aea4e 192 void display_update(bool RTC_disp, char* digits)
viewdeep51 0:ba33a62aea4e 193 {
viewdeep51 0:ba33a62aea4e 194 if(RTC_disp)
viewdeep51 0:ba33a62aea4e 195 {
viewdeep51 1:e116808d8b00 196 RTC_disp = false;
viewdeep51 0:ba33a62aea4e 197 for(uint8_t i = 0; i <= 3; i++) //to write all the four digits
viewdeep51 0:ba33a62aea4e 198 {
viewdeep51 1:e116808d8b00 199 if(i == 1)
viewdeep51 1:e116808d8b00 200 RTC_buffer[i] = RTC_buffer[i]|0b10000000; // to inc
viewdeep51 1:e116808d8b00 201 else
viewdeep51 1:e116808d8b00 202 __nop();
viewdeep51 1:e116808d8b00 203 max7219.write_digit(1, i+1, *(digits+i)); //device 2, digit 1-4 ,data 0x01
viewdeep51 0:ba33a62aea4e 204 }
viewdeep51 0:ba33a62aea4e 205 }
viewdeep51 0:ba33a62aea4e 206 else
viewdeep51 0:ba33a62aea4e 207 {
viewdeep51 0:ba33a62aea4e 208 for(uint8_t i = 0; i <= 3; i++) //to write all the four digits
viewdeep51 0:ba33a62aea4e 209 {
viewdeep51 1:e116808d8b00 210 max7219.write_digit(2, i+1, *(digits+i)); //device 1, digit 1-4 ,data pointer
viewdeep51 1:e116808d8b00 211 }
viewdeep51 1:e116808d8b00 212 }
viewdeep51 1:e116808d8b00 213 }
viewdeep51 1:e116808d8b00 214
viewdeep51 1:e116808d8b00 215 /**************************************************************************************
viewdeep51 1:e116808d8b00 216 EOT RTC read FUNCTION
viewdeep51 1:e116808d8b00 217 **************************************************************************************/
viewdeep51 1:e116808d8b00 218 void read_RTC()
viewdeep51 1:e116808d8b00 219 {
viewdeep51 1:e116808d8b00 220 time_t seconds = time(NULL);
viewdeep51 1:e116808d8b00 221 strftime(RTC_buffer, 5, "%H%M\n", localtime(&seconds));
viewdeep51 1:e116808d8b00 222 wait_ms(5);
viewdeep51 1:e116808d8b00 223 display_update(true, RTC_buffer);
viewdeep51 1:e116808d8b00 224 wait_ms(1);
viewdeep51 1:e116808d8b00 225 }
viewdeep51 1:e116808d8b00 226
viewdeep51 1:e116808d8b00 227 /**************************************************************************************
viewdeep51 1:e116808d8b00 228 EOT CHECK LED STATUS FUNCTION
viewdeep51 1:e116808d8b00 229 **************************************************************************************/
viewdeep51 1:e116808d8b00 230 void update_led()
viewdeep51 1:e116808d8b00 231 {
viewdeep51 1:e116808d8b00 232 if(++ticker_count == 25) //25x20 = 500ms
viewdeep51 1:e116808d8b00 233 {
viewdeep51 1:e116808d8b00 234 ticker_count = 0;
viewdeep51 1:e116808d8b00 235 toggle = !toggle; //normal cmd flash
viewdeep51 1:e116808d8b00 236 }
viewdeep51 1:e116808d8b00 237 else
viewdeep51 1:e116808d8b00 238 __nop();
viewdeep51 1:e116808d8b00 239
viewdeep51 1:e116808d8b00 240 if(++ticker_count_fast == 10) //20x10 =200
viewdeep51 1:e116808d8b00 241 {
viewdeep51 1:e116808d8b00 242 ticker_count_fast = 0;
viewdeep51 1:e116808d8b00 243 toggle_fast = !toggle_fast; //error flashing
viewdeep51 1:e116808d8b00 244 }
viewdeep51 1:e116808d8b00 245 else
viewdeep51 1:e116808d8b00 246 __nop();
viewdeep51 1:e116808d8b00 247
viewdeep51 1:e116808d8b00 248 if(test)
viewdeep51 1:e116808d8b00 249 {
viewdeep51 1:e116808d8b00 250 LED_CMD = ON;
viewdeep51 1:e116808d8b00 251
viewdeep51 1:e116808d8b00 252 for(uint8_t i=0;i<=1;i++) //control
viewdeep51 1:e116808d8b00 253 {
viewdeep51 1:e116808d8b00 254 LED_CTRL[i] = ON;
viewdeep51 1:e116808d8b00 255 }
viewdeep51 1:e116808d8b00 256 for(uint8_t i=0;i<=1;i++) //control
viewdeep51 1:e116808d8b00 257 {
viewdeep51 1:e116808d8b00 258 LED_DIR[i] = ON; /////////////////working here
viewdeep51 1:e116808d8b00 259 }
viewdeep51 1:e116808d8b00 260 for(uint8_t i=0;i<=7;i++) //active channel
viewdeep51 1:e116808d8b00 261 {
viewdeep51 1:e116808d8b00 262 LED_ACH[i] = ON; //duty cycle 10%
viewdeep51 0:ba33a62aea4e 263 }
viewdeep51 0:ba33a62aea4e 264 }
viewdeep51 1:e116808d8b00 265 else
viewdeep51 1:e116808d8b00 266 {
viewdeep51 1:e116808d8b00 267 for(uint8_t i=0;i<=10;i++) //cmd
viewdeep51 1:e116808d8b00 268 {
viewdeep51 1:e116808d8b00 269 if(led_cmd[i] == ON)
viewdeep51 1:e116808d8b00 270 LED_CMD[i] = ON;
viewdeep51 1:e116808d8b00 271 else
viewdeep51 1:e116808d8b00 272 __nop();
viewdeep51 1:e116808d8b00 273
viewdeep51 1:e116808d8b00 274 if(led_cmd[i] == OFF)
viewdeep51 1:e116808d8b00 275 LED_CMD[i] = OFF;
viewdeep51 1:e116808d8b00 276 else
viewdeep51 1:e116808d8b00 277 __nop();
viewdeep51 1:e116808d8b00 278
viewdeep51 1:e116808d8b00 279 if(led_cmd[i] == _FLASH)
viewdeep51 1:e116808d8b00 280 {
viewdeep51 1:e116808d8b00 281 if(toggle)
viewdeep51 1:e116808d8b00 282 LED_CMD[i]= ON;
viewdeep51 1:e116808d8b00 283 else
viewdeep51 1:e116808d8b00 284 LED_CMD[i] = OFF;
viewdeep51 1:e116808d8b00 285 }
viewdeep51 1:e116808d8b00 286 else
viewdeep51 1:e116808d8b00 287 __nop();
viewdeep51 1:e116808d8b00 288 }
viewdeep51 1:e116808d8b00 289 for(uint8_t i=0;i<=1;i++) //control
viewdeep51 1:e116808d8b00 290 {
viewdeep51 1:e116808d8b00 291 if(led_ctrl[i] == ON)
viewdeep51 1:e116808d8b00 292 LED_CTRL[i] = ON;
viewdeep51 1:e116808d8b00 293 else
viewdeep51 1:e116808d8b00 294 __nop();
viewdeep51 1:e116808d8b00 295
viewdeep51 1:e116808d8b00 296 if(led_ctrl[i] == OFF)
viewdeep51 1:e116808d8b00 297 LED_CTRL[i] = OFF; //duty cycle 10%
viewdeep51 1:e116808d8b00 298 else
viewdeep51 1:e116808d8b00 299 __nop();
viewdeep51 1:e116808d8b00 300
viewdeep51 1:e116808d8b00 301 if(led_ctrl[i] == _FLASH)
viewdeep51 1:e116808d8b00 302 {
viewdeep51 1:e116808d8b00 303 if(toggle)
viewdeep51 1:e116808d8b00 304 LED_CTRL[i]= ON;
viewdeep51 1:e116808d8b00 305 else
viewdeep51 1:e116808d8b00 306 LED_CTRL[i] = OFF;
viewdeep51 1:e116808d8b00 307 }
viewdeep51 1:e116808d8b00 308 else
viewdeep51 1:e116808d8b00 309 __nop();
viewdeep51 1:e116808d8b00 310 }
viewdeep51 1:e116808d8b00 311 for(uint8_t i=0;i<=7;i++) //active channel
viewdeep51 1:e116808d8b00 312 {
viewdeep51 1:e116808d8b00 313 if(led_ach[i] == ON)
viewdeep51 1:e116808d8b00 314 LED_ACH[i] = ON; //duty cycle 10%
viewdeep51 1:e116808d8b00 315 else
viewdeep51 1:e116808d8b00 316 __nop();
viewdeep51 1:e116808d8b00 317
viewdeep51 1:e116808d8b00 318 if(led_ach[i] == OFF)
viewdeep51 1:e116808d8b00 319 LED_ACH[i] = OFF; //duty cycle 10
viewdeep51 1:e116808d8b00 320 else
viewdeep51 1:e116808d8b00 321 __nop();
viewdeep51 1:e116808d8b00 322
viewdeep51 1:e116808d8b00 323 if(led_ach[i] == _FLASH)
viewdeep51 1:e116808d8b00 324 {
viewdeep51 1:e116808d8b00 325 if(toggle_fast)
viewdeep51 1:e116808d8b00 326 LED_ACH[i]= ON;
viewdeep51 1:e116808d8b00 327 else
viewdeep51 1:e116808d8b00 328 LED_ACH[i] = OFF;
viewdeep51 1:e116808d8b00 329 }
viewdeep51 1:e116808d8b00 330 else
viewdeep51 1:e116808d8b00 331 __nop();
viewdeep51 1:e116808d8b00 332 }
viewdeep51 1:e116808d8b00 333 }
viewdeep51 1:e116808d8b00 334 if(display_flash) //if command executed or command received
viewdeep51 1:e116808d8b00 335 {
viewdeep51 1:e116808d8b00 336 if(toggle)
viewdeep51 1:e116808d8b00 337 max7219.enable_device(2); //enable device 1 or normal mode
viewdeep51 1:e116808d8b00 338 else
viewdeep51 1:e116808d8b00 339 max7219.disable_device(2); //shutdown mode
viewdeep51 1:e116808d8b00 340 }
viewdeep51 1:e116808d8b00 341 else if(!device_ERR) //specific device is not in error device
viewdeep51 1:e116808d8b00 342 max7219.enable_device(2); //enable device 1 or normal mode;
viewdeep51 1:e116808d8b00 343 else
viewdeep51 1:e116808d8b00 344 __nop();
viewdeep51 0:ba33a62aea4e 345 }
viewdeep51 0:ba33a62aea4e 346
viewdeep51 0:ba33a62aea4e 347 /**************************************************************************************
viewdeep51 0:ba33a62aea4e 348 EOT State Machines FUNCTIONS
viewdeep51 0:ba33a62aea4e 349 **************************************************************************************/
viewdeep51 0:ba33a62aea4e 350 void HB_State_Machine() //run for 50ms at an interval of 10ms,event driven start stop
viewdeep51 0:ba33a62aea4e 351 {
viewdeep51 0:ba33a62aea4e 352 static int hb_state_cnt = 0;
viewdeep51 0:ba33a62aea4e 353 /* if(HB_send)
viewdeep51 0:ba33a62aea4e 354 {
viewdeep51 0:ba33a62aea4e 355 HB_send = false;
viewdeep51 0:ba33a62aea4e 356 hb_state_cnt = 0;
viewdeep51 0:ba33a62aea4e 357 }
viewdeep51 0:ba33a62aea4e 358 else
viewdeep51 0:ba33a62aea4e 359 __nop();
viewdeep51 0:ba33a62aea4e 360 */
viewdeep51 0:ba33a62aea4e 361 if(HB_ack_rcvd)
viewdeep51 0:ba33a62aea4e 362 {
viewdeep51 0:ba33a62aea4e 363 HB_ack_rcvd = false;
viewdeep51 0:ba33a62aea4e 364 HB_Ticker.detach();
viewdeep51 0:ba33a62aea4e 365 POT[device_addr].err_cnt = 0;
viewdeep51 0:ba33a62aea4e 366 POT[device_addr].c_err = false;
viewdeep51 0:ba33a62aea4e 367 hb_state_cnt = 0;
viewdeep51 0:ba33a62aea4e 368 if(POT[device_addr].slave_ID == ach_S)
viewdeep51 0:ba33a62aea4e 369 LED_ACH[send_ADDR - 1].ON();
viewdeep51 0:ba33a62aea4e 370 else
viewdeep51 0:ba33a62aea4e 371 LED_ACH[send_ADDR - 1].OFF();
viewdeep51 0:ba33a62aea4e 372 }
viewdeep51 0:ba33a62aea4e 373 else
viewdeep51 0:ba33a62aea4e 374 {
viewdeep51 0:ba33a62aea4e 375 if(++hb_state_cnt >= 5) //50ms
viewdeep51 0:ba33a62aea4e 376 {
viewdeep51 0:ba33a62aea4e 377 if((++POT[device_addr].err_cnt >= 3) && (!POT[device_addr].c_err)) //hb ack not received in third attempt
viewdeep51 0:ba33a62aea4e 378 {
viewdeep51 0:ba33a62aea4e 379 POT[device_addr].c_err = true;
viewdeep51 0:ba33a62aea4e 380 POT[device_addr].err_cnt = 0;
viewdeep51 0:ba33a62aea4e 381 LED_ACH[send_ADDR - 1].FLASHH();
viewdeep51 0:ba33a62aea4e 382 err_ID = POT[device_addr].slave_ID;
viewdeep51 0:ba33a62aea4e 383 err_Status = 1;
viewdeep51 0:ba33a62aea4e 384 BROADCAST_send = true; //broadcast needed to be sent
viewdeep51 0:ba33a62aea4e 385 if((POT[device_addr].slave_ID == pot_Slave_MCR) && (ach_S == pot_Slave_MCR))
viewdeep51 0:ba33a62aea4e 386 {
viewdeep51 0:ba33a62aea4e 387 ach_S = pot_Slave_ER;
viewdeep51 0:ba33a62aea4e 388 pot_MCR_err = true;
viewdeep51 0:ba33a62aea4e 389 switch_CH = true;
viewdeep51 0:ba33a62aea4e 390 }
viewdeep51 0:ba33a62aea4e 391 else if((POT[device_addr].slave_ID == pot_Slave_ER) && (!POT[device_addr-1].c_err))
viewdeep51 0:ba33a62aea4e 392 {
viewdeep51 0:ba33a62aea4e 393 //if((ach_S == pot_Slave_ER) && (pot_MCR_err))
viewdeep51 0:ba33a62aea4e 394 // pot_Error = true;
viewdeep51 0:ba33a62aea4e 395 // if((ach_S == pot_Slave_ER) && (!pot_MCR_err))
viewdeep51 0:ba33a62aea4e 396 // {
viewdeep51 0:ba33a62aea4e 397 ach_S = pot_Slave_MCR;
viewdeep51 0:ba33a62aea4e 398 pot_ER_err = true;
viewdeep51 0:ba33a62aea4e 399 switch_CH = true;
viewdeep51 0:ba33a62aea4e 400 }
viewdeep51 0:ba33a62aea4e 401 else
viewdeep51 0:ba33a62aea4e 402 pot_Error = false;
viewdeep51 0:ba33a62aea4e 403 }
viewdeep51 0:ba33a62aea4e 404 }
viewdeep51 0:ba33a62aea4e 405 hb_state_cnt=0;
viewdeep51 0:ba33a62aea4e 406 // pot_MCR_err = false;
viewdeep51 0:ba33a62aea4e 407 // pot_ER_err = false;
viewdeep51 0:ba33a62aea4e 408 err_Status = 0; // no communication error
viewdeep51 0:ba33a62aea4e 409 HB_Ticker.detach();
viewdeep51 0:ba33a62aea4e 410 }
viewdeep51 0:ba33a62aea4e 411 }
viewdeep51 0:ba33a62aea4e 412 }
viewdeep51 0:ba33a62aea4e 413
viewdeep51 0:ba33a62aea4e 414 void CMD_State_Machine() //function run periodcally in all connected devices on bus
viewdeep51 0:ba33a62aea4e 415 {
viewdeep51 0:ba33a62aea4e 416 int cmd_state_cnt=0;
viewdeep51 0:ba33a62aea4e 417
viewdeep51 0:ba33a62aea4e 418 if(RPM_cmd_ack) //PEOTX,CMD received in Master/SUB_Master, non Active Slave & Listner
viewdeep51 0:ba33a62aea4e 419 {
viewdeep51 0:ba33a62aea4e 420 RPM_cmd = false; //no more PEOTC will be sent onwards
viewdeep51 0:ba33a62aea4e 421 disp_FLASH.detach(); //timer stoped
viewdeep51 0:ba33a62aea4e 422 max7219.enable_device(1); //disp 1 back in normal mode
viewdeep51 0:ba33a62aea4e 423 buzzer = _OFF;
viewdeep51 0:ba33a62aea4e 424 hooter = _OFF;
viewdeep51 0:ba33a62aea4e 425 cmd_state_cnt = 0;
viewdeep51 0:ba33a62aea4e 426 RPM_cmd_ack = false;
viewdeep51 0:ba33a62aea4e 427 CMD_Ticker.detach(); //cmd state machine ticker stopped in all devices
viewdeep51 0:ba33a62aea4e 428 }
viewdeep51 0:ba33a62aea4e 429 //else
viewdeep51 0:ba33a62aea4e 430 // {
viewdeep51 0:ba33a62aea4e 431 //if(addr_ID != ach_S) //PEOTC, CMD received in other than Active Slave
viewdeep51 0:ba33a62aea4e 432 // return;
viewdeep51 0:ba33a62aea4e 433 else if((CMD_ack_send) && (addr_ID == ach_S)) //if Hotter is ON then send ACK, in case of active Slave
viewdeep51 0:ba33a62aea4e 434 {
viewdeep51 0:ba33a62aea4e 435 disp_FLASH.detach(); //flash timer stoped
viewdeep51 0:ba33a62aea4e 436 max7219.enable_device(1); //disp 1 back in normal mode steady ON
viewdeep51 0:ba33a62aea4e 437 buzzer = _OFF;
viewdeep51 0:ba33a62aea4e 438 hooter = _OFF;
viewdeep51 0:ba33a62aea4e 439 cmd_state_cnt = 0;
viewdeep51 0:ba33a62aea4e 440 CMD_ack_send = false;
viewdeep51 0:ba33a62aea4e 441 int_B.rise(NULL); //cmd ack send so disable the key of active slave
viewdeep51 0:ba33a62aea4e 442 CMD_Ticker.detach(); //would be stopped in active slave only
viewdeep51 0:ba33a62aea4e 443 }
viewdeep51 0:ba33a62aea4e 444 else if(hooter == _OFF) //if hooter still off
viewdeep51 0:ba33a62aea4e 445 {
viewdeep51 0:ba33a62aea4e 446 if(++cmd_state_cnt >= 12) //Hotter ON after 3sec
viewdeep51 0:ba33a62aea4e 447 {
viewdeep51 0:ba33a62aea4e 448 hooter = _ON;
viewdeep51 0:ba33a62aea4e 449 /* if(++cmd_state_cnt >= 96) //still command ack not recived for 24 sec
viewdeep51 0:ba33a62aea4e 450 {
viewdeep51 0:ba33a62aea4e 451 LED_CMD[cmd].OFF(); //command suspended
viewdeep51 0:ba33a62aea4e 452 buzzer = OFF;
viewdeep51 0:ba33a62aea4e 453 hooter = OFF;
viewdeep51 0:ba33a62aea4e 454 int_A.rise(NULL);
viewdeep51 0:ba33a62aea4e 455 int_A.rise(NULL);
viewdeep51 0:ba33a62aea4e 456 CMD_ticker.detach(); //timer stoped in all connected devices if ack not received in 3sec
viewdeep51 0:ba33a62aea4e 457 } */
viewdeep51 0:ba33a62aea4e 458 }
viewdeep51 0:ba33a62aea4e 459 else
viewdeep51 0:ba33a62aea4e 460 __nop();
viewdeep51 0:ba33a62aea4e 461 }
viewdeep51 0:ba33a62aea4e 462 }
viewdeep51 0:ba33a62aea4e 463 }
viewdeep51 0:ba33a62aea4e 464
viewdeep51 0:ba33a62aea4e 465 void R_A_Statemachine()
viewdeep51 0:ba33a62aea4e 466 {
viewdeep51 0:ba33a62aea4e 467 static int state_cnt = 0;
viewdeep51 0:ba33a62aea4e 468 if(ACK_rcvd)
viewdeep51 0:ba33a62aea4e 469 {
viewdeep51 0:ba33a62aea4e 470 //ack_ADDR = rcvd_ADDR;
viewdeep51 0:ba33a62aea4e 471 ACK_rcvd = false;
viewdeep51 0:ba33a62aea4e 472 }
viewdeep51 0:ba33a62aea4e 473 else if(REQ_rcvd)
viewdeep51 0:ba33a62aea4e 474 {
viewdeep51 0:ba33a62aea4e 475 //req_ADDR = rcvd_ADDR;
viewdeep51 0:ba33a62aea4e 476 REQ_rcvd = false;
viewdeep51 0:ba33a62aea4e 477 }
viewdeep51 0:ba33a62aea4e 478
viewdeep51 0:ba33a62aea4e 479 if(++state_cnt >= 10) //REQ not acknowledged for 5 sec, leds turn off, timer stopped
viewdeep51 0:ba33a62aea4e 480 {
viewdeep51 0:ba33a62aea4e 481 R_A_Ticker.detach();
viewdeep51 0:ba33a62aea4e 482 LED_CTRL[REQ_-1].OFF();
viewdeep51 0:ba33a62aea4e 483 LED_CTRL[ACK_-1].OFF();
viewdeep51 0:ba33a62aea4e 484 }
viewdeep51 0:ba33a62aea4e 485 else
viewdeep51 0:ba33a62aea4e 486 {
viewdeep51 0:ba33a62aea4e 487 if(ACH_SW_over) //active channel switchover true only after acknowledge receive
viewdeep51 0:ba33a62aea4e 488 {
viewdeep51 0:ba33a62aea4e 489 ACH_SW_over = false;
viewdeep51 0:ba33a62aea4e 490 if(addr_ID == pot_Master)
viewdeep51 0:ba33a62aea4e 491 {
viewdeep51 0:ba33a62aea4e 492 if(ack_ADDR == 3 || ack_ADDR == 4)
viewdeep51 0:ba33a62aea4e 493 {
viewdeep51 0:ba33a62aea4e 494 if(ach_S == pot_Slave_MCR)
viewdeep51 0:ba33a62aea4e 495 ach_S = pot_Slave_ER;
viewdeep51 0:ba33a62aea4e 496 else if(ach_S == pot_Slave_ER)
viewdeep51 0:ba33a62aea4e 497 ach_S = pot_Slave_MCR;
viewdeep51 0:ba33a62aea4e 498 }
viewdeep51 0:ba33a62aea4e 499 else if(ack_ADDR == 2 || ack_ADDR == 1)
viewdeep51 0:ba33a62aea4e 500 {
viewdeep51 0:ba33a62aea4e 501 if(ach_M == pot_Master)
viewdeep51 0:ba33a62aea4e 502 ach_M = pot_Submaster;
viewdeep51 0:ba33a62aea4e 503 else if(ach_M == pot_Submaster)
viewdeep51 0:ba33a62aea4e 504 ach_M = pot_Master;
viewdeep51 0:ba33a62aea4e 505 }
viewdeep51 0:ba33a62aea4e 506 switch_CH = true;
viewdeep51 0:ba33a62aea4e 507 state_cnt = 0;
viewdeep51 0:ba33a62aea4e 508 R_A_Ticker.detach();
viewdeep51 0:ba33a62aea4e 509 }
viewdeep51 0:ba33a62aea4e 510 else
viewdeep51 0:ba33a62aea4e 511 {
viewdeep51 0:ba33a62aea4e 512 state_cnt = 0;
viewdeep51 0:ba33a62aea4e 513 R_A_Ticker.detach();
viewdeep51 0:ba33a62aea4e 514 }
viewdeep51 0:ba33a62aea4e 515 }
viewdeep51 0:ba33a62aea4e 516 }
viewdeep51 0:ba33a62aea4e 517 }
viewdeep51 0:ba33a62aea4e 518
viewdeep51 0:ba33a62aea4e 519 void DIR_Statemachine(void)
viewdeep51 0:ba33a62aea4e 520 {
viewdeep51 0:ba33a62aea4e 521 static int dir_state_cnt = 0;
viewdeep51 0:ba33a62aea4e 522 if(DIR_cmd_ack)
viewdeep51 0:ba33a62aea4e 523 {
viewdeep51 0:ba33a62aea4e 524 DIR_cmd_ack = false;
viewdeep51 0:ba33a62aea4e 525 LED_DIR[dir-1].ON(); //led direction acknowledged turn steady
viewdeep51 0:ba33a62aea4e 526 buzzer = _OFF; //buzzer Off
viewdeep51 0:ba33a62aea4e 527 hooter = _OFF
viewdeep51 0:ba33a62aea4e 528 DIR_Ticker.detach();
viewdeep51 0:ba33a62aea4e 529 }
viewdeep51 0:ba33a62aea4e 530 else
viewdeep51 0:ba33a62aea4e 531 {
viewdeep51 0:ba33a62aea4e 532 if((++dir_state_cnt >= 12) && (hooter == _OFF)) //direction command not ack for 03 sec
viewdeep51 0:ba33a62aea4e 533 {
viewdeep51 0:ba33a62aea4e 534 hooter = _ON;
viewdeep51 0:ba33a62aea4e 535 dir_state_cnt = 0;
viewdeep51 0:ba33a62aea4e 536 }
viewdeep51 0:ba33a62aea4e 537 else
viewdeep51 0:ba33a62aea4e 538 __nop();
viewdeep51 0:ba33a62aea4e 539 }
viewdeep51 0:ba33a62aea4e 540
viewdeep51 0:ba33a62aea4e 541 }
viewdeep51 0:ba33a62aea4e 542
viewdeep51 0:ba33a62aea4e 543
viewdeep51 0:ba33a62aea4e 544 void DISP_FLASH(void) //function attached to event driven ticker disp_FLASH
viewdeep51 0:ba33a62aea4e 545 {
viewdeep51 0:ba33a62aea4e 546 _disp_FLASH = !_disp_FLASH;
viewdeep51 0:ba33a62aea4e 547 if(_disp_FLASH)
viewdeep51 0:ba33a62aea4e 548 max7219.disable_device(1);
viewdeep51 0:ba33a62aea4e 549 else
viewdeep51 0:ba33a62aea4e 550 max7219.enable_device(1);
viewdeep51 0:ba33a62aea4e 551 }
viewdeep51 0:ba33a62aea4e 552
viewdeep51 0:ba33a62aea4e 553 void NUMERIC_handler(uint8_t key_ID) //function sacnning all the 0-9 number keys
viewdeep51 0:ba33a62aea4e 554 {
viewdeep51 0:ba33a62aea4e 555 uint8_t num;
viewdeep51 0:ba33a62aea4e 556 num = key_ID;
viewdeep51 0:ba33a62aea4e 557 if(key_ID != FALSE0)
viewdeep51 0:ba33a62aea4e 558 {
viewdeep51 0:ba33a62aea4e 559 if(((ach_M == pot_Master) && (addr_ID == pot_Master)) || ((ach_M == pot_Submaster) && (addr_ID == pot_Submaster))) //for Master
viewdeep51 0:ba33a62aea4e 560 {
viewdeep51 0:ba33a62aea4e 561 if(digit_disp1 <= 1)
viewdeep51 0:ba33a62aea4e 562 digit_disp1 = 4;
viewdeep51 0:ba33a62aea4e 563 else
viewdeep51 0:ba33a62aea4e 564 digit_disp1-- ;
viewdeep51 0:ba33a62aea4e 565
viewdeep51 0:ba33a62aea4e 566 rpm_data[digit_disp1-1] = num;
viewdeep51 0:ba33a62aea4e 567 max7219.write_digit(1,digit_disp1,rpm_data[digit_disp1-1]); //4th digit updated on first press, then 3rd on next press....soon
viewdeep51 0:ba33a62aea4e 568 }
viewdeep51 0:ba33a62aea4e 569 else
viewdeep51 0:ba33a62aea4e 570 __nop();
viewdeep51 0:ba33a62aea4e 571 }
viewdeep51 0:ba33a62aea4e 572 else
viewdeep51 0:ba33a62aea4e 573 __nop();
viewdeep51 0:ba33a62aea4e 574 }
viewdeep51 0:ba33a62aea4e 575 }
viewdeep51 0:ba33a62aea4e 576
viewdeep51 0:ba33a62aea4e 577 void CTRL_handler(uint8_t CTRL_ID) //handle control transfer
viewdeep51 0:ba33a62aea4e 578 {
viewdeep51 0:ba33a62aea4e 579 if(CTRL_ID != FALSE1)
viewdeep51 0:ba33a62aea4e 580 {
viewdeep51 0:ba33a62aea4e 581 if((addr_ID == pot_Slave_MCR) || (addr_ID == pot_Slave_ER))
viewdeep51 0:ba33a62aea4e 582 {
viewdeep51 0:ba33a62aea4e 583 if(CTRL_ID == REQ_)
viewdeep51 0:ba33a62aea4e 584 {
viewdeep51 0:ba33a62aea4e 585 req = REQ_; //req data updated 0 here, same int values as in enum
viewdeep51 0:ba33a62aea4e 586 LED_CTRL[REQ_-1].FLASHH(); //req led flash starts
viewdeep51 0:ba33a62aea4e 587 R_A_Ticker.attach(&R_A_Statemachine,0.5);
viewdeep51 0:ba33a62aea4e 588 }
viewdeep51 0:ba33a62aea4e 589 if(CTRL_ID == ACK_ && REQ_rcvd)
viewdeep51 0:ba33a62aea4e 590 {
viewdeep51 0:ba33a62aea4e 591 ack = ACK_; //ack data updated 2 here
viewdeep51 0:ba33a62aea4e 592 LED_CTRL[ACK_-1].OFF(); //ack led turns off
viewdeep51 0:ba33a62aea4e 593 R_A_Ticker.detach();
viewdeep51 0:ba33a62aea4e 594 }
viewdeep51 0:ba33a62aea4e 595 }
viewdeep51 0:ba33a62aea4e 596 }
viewdeep51 0:ba33a62aea4e 597 else
viewdeep51 0:ba33a62aea4e 598 __nop(); //then do nothing
viewdeep51 0:ba33a62aea4e 599 }
viewdeep51 0:ba33a62aea4e 600
viewdeep51 0:ba33a62aea4e 601 void DIR_handler(uint8_t DIR_ID) //handle control transfer
viewdeep51 0:ba33a62aea4e 602 {
viewdeep51 0:ba33a62aea4e 603 if(DIR_ID != FALSE2)
viewdeep51 0:ba33a62aea4e 604 {
viewdeep51 0:ba33a62aea4e 605 if(addr_ID == ach_M)
viewdeep51 0:ba33a62aea4e 606 {
viewdeep51 0:ba33a62aea4e 607 if(DIR_ID == AHEAD)
viewdeep51 0:ba33a62aea4e 608 {
viewdeep51 0:ba33a62aea4e 609 dir = AHEAD;
viewdeep51 0:ba33a62aea4e 610 LED_DIR[dir-1].FLASHH(); //led direction AHEAD start flashing
viewdeep51 0:ba33a62aea4e 611 buzzer = _ON; //buzzer ON
viewdeep51 0:ba33a62aea4e 612 DIR_cmd = true;
viewdeep51 0:ba33a62aea4e 613 DIR_Ticker.attach(&DIR_Statemachine,0.5);
viewdeep51 0:ba33a62aea4e 614 }
viewdeep51 0:ba33a62aea4e 615 else
viewdeep51 0:ba33a62aea4e 616 __nop();
viewdeep51 0:ba33a62aea4e 617 if(DIR_ID == ASTERN)
viewdeep51 0:ba33a62aea4e 618 {
viewdeep51 0:ba33a62aea4e 619 dir = ASTERN;
viewdeep51 0:ba33a62aea4e 620 LED_DIR[dir-1].FLASHH(); //led direction AHEAD start flashing
viewdeep51 0:ba33a62aea4e 621 buzzer = _ON; //buzzer ON
viewdeep51 0:ba33a62aea4e 622 DIR_cmd = true;
viewdeep51 0:ba33a62aea4e 623 DIR_Ticker.attach(&DIR_Statemachine,0.5);
viewdeep51 0:ba33a62aea4e 624 }
viewdeep51 0:ba33a62aea4e 625 else
viewdeep51 0:ba33a62aea4e 626 __nop();
viewdeep51 0:ba33a62aea4e 627 }
viewdeep51 0:ba33a62aea4e 628 else if (addr_ID == ach_S)
viewdeep51 0:ba33a62aea4e 629 {
viewdeep51 0:ba33a62aea4e 630 if(DIR_ID == AHEAD)
viewdeep51 0:ba33a62aea4e 631 {
viewdeep51 0:ba33a62aea4e 632 if(rcvd_DIR && (dir == AHEAD)); //direction command is received
viewdeep51 0:ba33a62aea4e 633 LED_DIR[dir-1].ON(); //led direction AHEAD start flashing
viewdeep51 0:ba33a62aea4e 634 buzzer = _OFF; //buzzer ON
viewdeep51 0:ba33a62aea4e 635 DIR_cmd = true;
viewdeep51 0:ba33a62aea4e 636 DIR_Ticker.attach(&DIR_Statemachine,0.5);
viewdeep51 0:ba33a62aea4e 637 }
viewdeep51 0:ba33a62aea4e 638 if(DIR_ID == ASTERN)
viewdeep51 0:ba33a62aea4e 639 {
viewdeep51 0:ba33a62aea4e 640 dir = ASTERN;
viewdeep51 0:ba33a62aea4e 641 LED_DIR[dir-1].FLASHH(); //led direction AHEAD start flashing
viewdeep51 0:ba33a62aea4e 642 buzzer = _ON; //buzzer ON
viewdeep51 0:ba33a62aea4e 643 DIR_cmd = true;
viewdeep51 0:ba33a62aea4e 644 DIR_Ticker.attach(&DIR_Statemachine,0.5);
viewdeep51 0:ba33a62aea4e 645 }
viewdeep51 0:ba33a62aea4e 646 }
viewdeep51 0:ba33a62aea4e 647 }
viewdeep51 0:ba33a62aea4e 648 else
viewdeep51 0:ba33a62aea4e 649 __nop(); //then do nothing
viewdeep51 0:ba33a62aea4e 650 }
viewdeep51 0:ba33a62aea4e 651
viewdeep51 0:ba33a62aea4e 652 void DISP_handler(uint8_t DISP_ID) //handle control transfer
viewdeep51 0:ba33a62aea4e 653 {
viewdeep51 0:ba33a62aea4e 654 uint8_t disp_key;
viewdeep51 0:ba33a62aea4e 655 disp_key = DISP_ID;
viewdeep51 0:ba33a62aea4e 656 if(DISP_ID != FALSE3)
viewdeep51 0:ba33a62aea4e 657 {
viewdeep51 0:ba33a62aea4e 658 if((addr_ID == ach_M)||(addr_ID == ach_S))
viewdeep51 0:ba33a62aea4e 659 {
viewdeep51 0:ba33a62aea4e 660 switch(disp_key)
viewdeep51 0:ba33a62aea4e 661 {
viewdeep51 0:ba33a62aea4e 662 case clr_ENTRY: //CE delete only last/4th digit and shift others digits towards right/4th digit
viewdeep51 0:ba33a62aea4e 663 if(addr_ID == ach_M)
viewdeep51 0:ba33a62aea4e 664 {
viewdeep51 0:ba33a62aea4e 665 for(uint8_t i = 3; i >= 0 ; i--)
viewdeep51 0:ba33a62aea4e 666 {
viewdeep51 0:ba33a62aea4e 667 rpm_data[i] = rpm_data[i-1];
viewdeep51 0:ba33a62aea4e 668 if(i==0)
viewdeep51 0:ba33a62aea4e 669 rpm_data[i] = 0; //data 0 means left most digit will be blank bcoz no decode mode is used
viewdeep51 0:ba33a62aea4e 670 }
viewdeep51 0:ba33a62aea4e 671 for(uint8_t i = 0; i >=3; i++)
viewdeep51 0:ba33a62aea4e 672 {
viewdeep51 0:ba33a62aea4e 673 max7219.write_digit(1,i+1,rpm_data[i]); //4th digit will be deleted whilers are shifted towards right 1st will be blank
viewdeep51 0:ba33a62aea4e 674 }
viewdeep51 0:ba33a62aea4e 675 }
viewdeep51 0:ba33a62aea4e 676 else
viewdeep51 0:ba33a62aea4e 677 {
viewdeep51 0:ba33a62aea4e 678 __nop();
viewdeep51 0:ba33a62aea4e 679 }
viewdeep51 0:ba33a62aea4e 680 break;
viewdeep51 0:ba33a62aea4e 681
viewdeep51 0:ba33a62aea4e 682 case last_ENTRY: //C delete all digits in DS1 and show last entered value
viewdeep51 0:ba33a62aea4e 683 if(addr_ID == ach_M)
viewdeep51 0:ba33a62aea4e 684 {
viewdeep51 0:ba33a62aea4e 685 for(uint8_t i = 0; i >=3; i++)
viewdeep51 0:ba33a62aea4e 686 {
viewdeep51 0:ba33a62aea4e 687 max7219.write_digit(1,i+1,last_entry[i]); //last entery displayed
viewdeep51 0:ba33a62aea4e 688 }
viewdeep51 0:ba33a62aea4e 689 }
viewdeep51 0:ba33a62aea4e 690 else
viewdeep51 0:ba33a62aea4e 691 {
viewdeep51 0:ba33a62aea4e 692 __nop();
viewdeep51 0:ba33a62aea4e 693 }
viewdeep51 0:ba33a62aea4e 694 break;
viewdeep51 0:ba33a62aea4e 695
viewdeep51 0:ba33a62aea4e 696 case ENTER_ACK:
viewdeep51 0:ba33a62aea4e 697 if((addr_ID == ach_S)&&(CMD_rcvd)) //RPM command ack needs to be sent
viewdeep51 0:ba33a62aea4e 698 { //flashing display1 turned steady
viewdeep51 0:ba33a62aea4e 699 RPM_cmd_ack = true; //RPM command acknowledged by active slave
viewdeep51 0:ba33a62aea4e 700 }
viewdeep51 0:ba33a62aea4e 701 else if (addr_ID == ach_M) //in case of active masters
viewdeep51 0:ba33a62aea4e 702 { //disp1 start flashing, and data sent over UART for all digits 1-4
viewdeep51 0:ba33a62aea4e 703 for(uint8_t i = 0; i >=3; i++)
viewdeep51 0:ba33a62aea4e 704 {
viewdeep51 0:ba33a62aea4e 705 last_entry[i] = rpm_data[i]; //data saved to last entery
viewdeep51 0:ba33a62aea4e 706 }
viewdeep51 0:ba33a62aea4e 707 disp_FLASH.attach(&DISP_FLASH,0.500); //timer started
viewdeep51 0:ba33a62aea4e 708 int_A.rise(NULL); //all key functions DISabled for PORTA,B in active MASTER only
viewdeep51 0:ba33a62aea4e 709 int_B.rise(NULL);
viewdeep51 0:ba33a62aea4e 710 RPM_cmd = true; //command need to be send
viewdeep51 0:ba33a62aea4e 711 }
viewdeep51 0:ba33a62aea4e 712 else
viewdeep51 0:ba33a62aea4e 713 {
viewdeep51 0:ba33a62aea4e 714 __nop();
viewdeep51 0:ba33a62aea4e 715 }
viewdeep51 0:ba33a62aea4e 716 break;
viewdeep51 0:ba33a62aea4e 717
viewdeep51 0:ba33a62aea4e 718 default:
viewdeep51 0:ba33a62aea4e 719
viewdeep51 0:ba33a62aea4e 720 break;
viewdeep51 0:ba33a62aea4e 721 }
viewdeep51 0:ba33a62aea4e 722 }
viewdeep51 0:ba33a62aea4e 723 }
viewdeep51 0:ba33a62aea4e 724 else
viewdeep51 0:ba33a62aea4e 725 __nop(); //then do nothing
viewdeep51 0:ba33a62aea4e 726 }
viewdeep51 0:ba33a62aea4e 727
viewdeep51 0:ba33a62aea4e 728 void BRT_handler(float brt)
viewdeep51 0:ba33a62aea4e 729 {
viewdeep51 0:ba33a62aea4e 730 for(uint8_t i=0;i<=1;i++) //cmd led initialisation
viewdeep51 0:ba33a62aea4e 731 {
viewdeep51 0:ba33a62aea4e 732 LED_DIR[i].set_Brightness(brt); //setting period 100 ms
viewdeep51 0:ba33a62aea4e 733 }
viewdeep51 0:ba33a62aea4e 734 for(uint8_t i=0;i<=1;i++) //ctrl led intialisation
viewdeep51 0:ba33a62aea4e 735 {
viewdeep51 0:ba33a62aea4e 736 LED_CTRL[i].set_Brightness(brt);
viewdeep51 0:ba33a62aea4e 737 }
viewdeep51 0:ba33a62aea4e 738 for(uint8_t i=0; i<=7;i++) //ach led initialisation
viewdeep51 0:ba33a62aea4e 739 {
viewdeep51 0:ba33a62aea4e 740 LED_ACH[i].set_Brightness(brt);
viewdeep51 0:ba33a62aea4e 741 }
viewdeep51 0:ba33a62aea4e 742 }
viewdeep51 0:ba33a62aea4e 743
viewdeep51 0:ba33a62aea4e 744 void SET_handler(uint8_t Set_ID)
viewdeep51 0:ba33a62aea4e 745 {
viewdeep51 0:ba33a62aea4e 746 if(Set_ID != FALSE4)
viewdeep51 0:ba33a62aea4e 747 {
viewdeep51 0:ba33a62aea4e 748 if(Set_ID == INC)
viewdeep51 0:ba33a62aea4e 749 {
viewdeep51 0:ba33a62aea4e 750 if(brightness <= 0.99f)
viewdeep51 0:ba33a62aea4e 751 {
viewdeep51 0:ba33a62aea4e 752 brightness = +0.01;
viewdeep51 0:ba33a62aea4e 753 BRT_handler(brightness);
viewdeep51 0:ba33a62aea4e 754 }
viewdeep51 0:ba33a62aea4e 755 else
viewdeep51 0:ba33a62aea4e 756 {
viewdeep51 0:ba33a62aea4e 757 brightness = 0.99;
viewdeep51 0:ba33a62aea4e 758 BRT_handler(brightness);
viewdeep51 0:ba33a62aea4e 759 }
viewdeep51 0:ba33a62aea4e 760
viewdeep51 0:ba33a62aea4e 761 }
viewdeep51 0:ba33a62aea4e 762 else if(Set_ID == DEC)
viewdeep51 0:ba33a62aea4e 763 {
viewdeep51 0:ba33a62aea4e 764 if(brightness >= 0.01f)
viewdeep51 0:ba33a62aea4e 765 {
viewdeep51 0:ba33a62aea4e 766 brightness = -0.01;
viewdeep51 0:ba33a62aea4e 767 BRT_handler(brightness);
viewdeep51 0:ba33a62aea4e 768 }
viewdeep51 0:ba33a62aea4e 769 else
viewdeep51 0:ba33a62aea4e 770 {
viewdeep51 0:ba33a62aea4e 771 brightness = 0.01; //minimum brightnes
viewdeep51 0:ba33a62aea4e 772 BRT_handler(brightness);
viewdeep51 0:ba33a62aea4e 773 }
viewdeep51 0:ba33a62aea4e 774 }
viewdeep51 0:ba33a62aea4e 775 else if(Set_ID == TEST)
viewdeep51 0:ba33a62aea4e 776 {
viewdeep51 0:ba33a62aea4e 777 test_cnt++;
viewdeep51 0:ba33a62aea4e 778 if(test_cnt <= 1)
viewdeep51 0:ba33a62aea4e 779 test = true;
viewdeep51 0:ba33a62aea4e 780 else if(test_cnt >= 2)
viewdeep51 0:ba33a62aea4e 781 {
viewdeep51 0:ba33a62aea4e 782 test = false;
viewdeep51 0:ba33a62aea4e 783 test_cnt = 0;
viewdeep51 0:ba33a62aea4e 784 }
viewdeep51 0:ba33a62aea4e 785 }
viewdeep51 0:ba33a62aea4e 786 }
viewdeep51 0:ba33a62aea4e 787 else
viewdeep51 0:ba33a62aea4e 788 __nop();
viewdeep51 0:ba33a62aea4e 789 }
viewdeep51 0:ba33a62aea4e 790
viewdeep51 0:ba33a62aea4e 791
viewdeep51 0:ba33a62aea4e 792
viewdeep51 0:ba33a62aea4e 793
viewdeep51 0:ba33a62aea4e 794 /**************************************************************************************
viewdeep51 0:ba33a62aea4e 795 EOT SPI Data Read KEY FUNCTIONS
viewdeep51 0:ba33a62aea4e 796 **************************************************************************************/
viewdeep51 0:ba33a62aea4e 797 unsigned char read_KEY_SPI(int CH)
viewdeep51 0:ba33a62aea4e 798 {
viewdeep51 0:ba33a62aea4e 799 char _key;
viewdeep51 0:ba33a62aea4e 800 uint8_t spi_err=0;
viewdeep51 0:ba33a62aea4e 801 switch(CH)
viewdeep51 0:ba33a62aea4e 802 {
viewdeep51 0:ba33a62aea4e 803 case 1:
viewdeep51 0:ba33a62aea4e 804 if(spi_err<3)
viewdeep51 0:ba33a62aea4e 805 {
viewdeep51 0:ba33a62aea4e 806 _key=mcp23s17_1.intcapa(); // read(INTCAPA_ADDR);
viewdeep51 0:ba33a62aea4e 807 if(mcp23s17_1.intcapa()) //read(INTCAPA_ADDR)) again if some non zero value obtained //if Interrupt pending
viewdeep51 0:ba33a62aea4e 808 {
viewdeep51 0:ba33a62aea4e 809 spi_err++;
viewdeep51 0:ba33a62aea4e 810 }
viewdeep51 0:ba33a62aea4e 811 else
viewdeep51 0:ba33a62aea4e 812 {
viewdeep51 0:ba33a62aea4e 813 spi_err=0;
viewdeep51 0:ba33a62aea4e 814 }
viewdeep51 0:ba33a62aea4e 815 }
viewdeep51 0:ba33a62aea4e 816 else
viewdeep51 0:ba33a62aea4e 817 {
viewdeep51 0:ba33a62aea4e 818 _key=0;
viewdeep51 0:ba33a62aea4e 819 spi_ERR=true;
viewdeep51 0:ba33a62aea4e 820 }
viewdeep51 0:ba33a62aea4e 821 break;
viewdeep51 0:ba33a62aea4e 822
viewdeep51 0:ba33a62aea4e 823 case 2:
viewdeep51 0:ba33a62aea4e 824 if(spi_err<3)
viewdeep51 0:ba33a62aea4e 825 {
viewdeep51 0:ba33a62aea4e 826 _key=mcp23s17_1.intcapb();
viewdeep51 0:ba33a62aea4e 827 if(mcp23s17_1.intcapb()) //if Interrupt pending
viewdeep51 0:ba33a62aea4e 828 {
viewdeep51 0:ba33a62aea4e 829 spi_err++;
viewdeep51 0:ba33a62aea4e 830 }
viewdeep51 0:ba33a62aea4e 831 else
viewdeep51 0:ba33a62aea4e 832 {
viewdeep51 0:ba33a62aea4e 833 spi_err=0;
viewdeep51 0:ba33a62aea4e 834 }
viewdeep51 0:ba33a62aea4e 835 }
viewdeep51 0:ba33a62aea4e 836 else
viewdeep51 0:ba33a62aea4e 837 {
viewdeep51 0:ba33a62aea4e 838 _key=0;
viewdeep51 0:ba33a62aea4e 839 spi_ERR=true;
viewdeep51 0:ba33a62aea4e 840 }
viewdeep51 0:ba33a62aea4e 841 break;
viewdeep51 0:ba33a62aea4e 842
viewdeep51 0:ba33a62aea4e 843 case 3:
viewdeep51 0:ba33a62aea4e 844 if(spi_err<3)
viewdeep51 0:ba33a62aea4e 845 {
viewdeep51 0:ba33a62aea4e 846 _key=mcp23s17_2.intcapa();
viewdeep51 0:ba33a62aea4e 847 if(mcp23s17_2.intcapa()) //if Interrupt pending
viewdeep51 0:ba33a62aea4e 848 {
viewdeep51 0:ba33a62aea4e 849 spi_err++;
viewdeep51 0:ba33a62aea4e 850 }
viewdeep51 0:ba33a62aea4e 851 else
viewdeep51 0:ba33a62aea4e 852 {
viewdeep51 0:ba33a62aea4e 853 spi_err=0;
viewdeep51 0:ba33a62aea4e 854 }
viewdeep51 0:ba33a62aea4e 855 }
viewdeep51 0:ba33a62aea4e 856 else
viewdeep51 0:ba33a62aea4e 857 {
viewdeep51 0:ba33a62aea4e 858 _key=0;
viewdeep51 0:ba33a62aea4e 859 spi_ERR=true;
viewdeep51 0:ba33a62aea4e 860 }
viewdeep51 0:ba33a62aea4e 861 break;
viewdeep51 0:ba33a62aea4e 862
viewdeep51 0:ba33a62aea4e 863 case 4:
viewdeep51 0:ba33a62aea4e 864 _key = mcp23s17_2.gpiob(); //address read PORTB of chip2 for getting pot addresses
viewdeep51 0:ba33a62aea4e 865 break;
viewdeep51 0:ba33a62aea4e 866 default:
viewdeep51 0:ba33a62aea4e 867 _key = 0;
viewdeep51 0:ba33a62aea4e 868 break;
viewdeep51 0:ba33a62aea4e 869 }
viewdeep51 0:ba33a62aea4e 870 return(_key);
viewdeep51 0:ba33a62aea4e 871 }
viewdeep51 0:ba33a62aea4e 872 void read_KEY_A() //function check status of PORTA of MCP23S17 (1) chip
viewdeep51 0:ba33a62aea4e 873 {
viewdeep51 0:ba33a62aea4e 874 char key_status = 0;
viewdeep51 0:ba33a62aea4e 875 key_status = read_KEY_SPI(ch_A); //to read portA of mcp23s17(1)
viewdeep51 0:ba33a62aea4e 876 if(key_status != 0xff) //means some key must have been pressed
viewdeep51 0:ba33a62aea4e 877 {
viewdeep51 0:ba33a62aea4e 878 switch(key_status)
viewdeep51 0:ba33a62aea4e 879 {
viewdeep51 0:ba33a62aea4e 880 case 0xfe: //0xfe GPA0
viewdeep51 1:e116808d8b00 881 num_KEY = ZERO;
viewdeep51 0:ba33a62aea4e 882 break;
viewdeep51 0:ba33a62aea4e 883 case 0xfd: //0xfd GPA1
viewdeep51 0:ba33a62aea4e 884 num_KEY = ONE;
viewdeep51 0:ba33a62aea4e 885 break;
viewdeep51 0:ba33a62aea4e 886 case 0xfb: //0xfb GPA2
viewdeep51 0:ba33a62aea4e 887 num_KEY = TWO;
viewdeep51 0:ba33a62aea4e 888 break;
viewdeep51 0:ba33a62aea4e 889 case 0xf7: //0xf7 GPA3
viewdeep51 0:ba33a62aea4e 890 num_KEY = THREE;
viewdeep51 0:ba33a62aea4e 891 break;
viewdeep51 0:ba33a62aea4e 892 case 0xef: //0xef GPA4
viewdeep51 0:ba33a62aea4e 893 num_KEY = FOUR;
viewdeep51 0:ba33a62aea4e 894 break;
viewdeep51 0:ba33a62aea4e 895 case 0xdf: //0xdf GPA5
viewdeep51 0:ba33a62aea4e 896 num_KEY = FIVE;
viewdeep51 0:ba33a62aea4e 897 break;
viewdeep51 0:ba33a62aea4e 898 case 0xbf: //0xbf GPA6
viewdeep51 0:ba33a62aea4e 899 num_KEY = SIX;
viewdeep51 0:ba33a62aea4e 900 break;
viewdeep51 0:ba33a62aea4e 901 case 0x7f: //0x7f GPA7
viewdeep51 0:ba33a62aea4e 902 num_KEY = SEVEN;
viewdeep51 0:ba33a62aea4e 903 break;
viewdeep51 0:ba33a62aea4e 904 default:
viewdeep51 0:ba33a62aea4e 905 num_KEY = FALSE0;
viewdeep51 0:ba33a62aea4e 906 break;
viewdeep51 0:ba33a62aea4e 907 }
viewdeep51 0:ba33a62aea4e 908 NUMERIC_handler(num_KEY);
viewdeep51 0:ba33a62aea4e 909 }
viewdeep51 0:ba33a62aea4e 910 }
viewdeep51 0:ba33a62aea4e 911
viewdeep51 0:ba33a62aea4e 912 void read_KEY_B()
viewdeep51 0:ba33a62aea4e 913 {
viewdeep51 0:ba33a62aea4e 914 char key_status = 0;
viewdeep51 0:ba33a62aea4e 915 key_status = read_KEY_SPI(ch_B); //to read portBof mcp23s17(1)
viewdeep51 0:ba33a62aea4e 916 if(key_status != 0xff)
viewdeep51 0:ba33a62aea4e 917 {
viewdeep51 0:ba33a62aea4e 918 switch(key_status)
viewdeep51 0:ba33a62aea4e 919 {
viewdeep51 0:ba33a62aea4e 920 case 0xfe: //0xfe GPA0
viewdeep51 0:ba33a62aea4e 921 num_KEY = EIGHT;
viewdeep51 0:ba33a62aea4e 922 NUMERIC_handler(num_KEY);
viewdeep51 0:ba33a62aea4e 923 break;
viewdeep51 0:ba33a62aea4e 924 case 0xfd: //0xfd GPA1
viewdeep51 0:ba33a62aea4e 925 num_KEY = NINE;
viewdeep51 0:ba33a62aea4e 926 NUMERIC_handler(num_KEY);
viewdeep51 0:ba33a62aea4e 927 break;
viewdeep51 0:ba33a62aea4e 928 case 0xfb: //0xfb GPA2
viewdeep51 0:ba33a62aea4e 929 dir_KEY = AHEAD;
viewdeep51 0:ba33a62aea4e 930 DIR_handler(dir_KEY);
viewdeep51 0:ba33a62aea4e 931 break;
viewdeep51 0:ba33a62aea4e 932 case 0xf7: //0xf7 GPA3
viewdeep51 0:ba33a62aea4e 933 dir_KEY = ASTERN;
viewdeep51 0:ba33a62aea4e 934 DIR_handler(dir_KEY);
viewdeep51 0:ba33a62aea4e 935 break;
viewdeep51 0:ba33a62aea4e 936 case 0xef: //0xef GPA4
viewdeep51 0:ba33a62aea4e 937 ctrl_KEY = ACK;
viewdeep51 0:ba33a62aea4e 938 CTRL_handler(ctrl_KEY);
viewdeep51 0:ba33a62aea4e 939 break;
viewdeep51 0:ba33a62aea4e 940 case 0xdf: //0xdf GPA5
viewdeep51 0:ba33a62aea4e 941 disp_KEY = clr_ENTRY; //CE
viewdeep51 0:ba33a62aea4e 942 DISP_handler(disp_KEY);
viewdeep51 0:ba33a62aea4e 943 break;
viewdeep51 0:ba33a62aea4e 944 case 0xbf: //0xbf GPA6
viewdeep51 0:ba33a62aea4e 945 disp_KEY = last_ENTRY; //C
viewdeep51 0:ba33a62aea4e 946 DISP_handler(disp_KEY);
viewdeep51 0:ba33a62aea4e 947 break;
viewdeep51 0:ba33a62aea4e 948 case 0x7f: //0x7f GPA7
viewdeep51 0:ba33a62aea4e 949 disp_KEY = ENTER_ACK;
viewdeep51 0:ba33a62aea4e 950 DISP_handler(disp_KEY);
viewdeep51 0:ba33a62aea4e 951 break;
viewdeep51 0:ba33a62aea4e 952 default:
viewdeep51 0:ba33a62aea4e 953 num_KEY = FALSE0;
viewdeep51 0:ba33a62aea4e 954 ctrl_KEY = FALSE1;
viewdeep51 0:ba33a62aea4e 955 dir_KEY = FALSE2;
viewdeep51 0:ba33a62aea4e 956 disp_KEY = FALSE3;
viewdeep51 0:ba33a62aea4e 957 break;
viewdeep51 0:ba33a62aea4e 958 }
viewdeep51 0:ba33a62aea4e 959 }
viewdeep51 0:ba33a62aea4e 960 }
viewdeep51 0:ba33a62aea4e 961 void read_KEY_C()
viewdeep51 0:ba33a62aea4e 962 {
viewdeep51 0:ba33a62aea4e 963 char key_status = 0;
viewdeep51 0:ba33a62aea4e 964 key_status = read_KEY_SPI(ch_C); //to read portA of mcp23s17(2)
viewdeep51 0:ba33a62aea4e 965 if(key_status != 0xff)
viewdeep51 0:ba33a62aea4e 966 {
viewdeep51 0:ba33a62aea4e 967 if(key_status==0xfe)
viewdeep51 0:ba33a62aea4e 968 {
viewdeep51 0:ba33a62aea4e 969 ctrl_KEY = REQ_; //control transfer REQ button pressed
viewdeep51 0:ba33a62aea4e 970 CTRL_handler(ctrl_KEY);
viewdeep51 0:ba33a62aea4e 971 }
viewdeep51 0:ba33a62aea4e 972 else
viewdeep51 0:ba33a62aea4e 973 {
viewdeep51 0:ba33a62aea4e 974 if(key_status==0xfd)
viewdeep51 0:ba33a62aea4e 975 set_KEY = INC; //setting key INC
viewdeep51 0:ba33a62aea4e 976 else if(key_status==0xfb)
viewdeep51 0:ba33a62aea4e 977 set_KEY = DEC; //setting key DEC
viewdeep51 0:ba33a62aea4e 978 else if(key_status==0xf7)
viewdeep51 0:ba33a62aea4e 979 set_KEY = TEST; //setting key TEST
viewdeep51 0:ba33a62aea4e 980 else
viewdeep51 0:ba33a62aea4e 981 {
viewdeep51 0:ba33a62aea4e 982 set_KEY = FALSE4; //setting key TEST
viewdeep51 0:ba33a62aea4e 983 ctrl_KEY = FALSE1;
viewdeep51 0:ba33a62aea4e 984 }
viewdeep51 0:ba33a62aea4e 985
viewdeep51 0:ba33a62aea4e 986 SET_handler(set_KEY);
viewdeep51 0:ba33a62aea4e 987 }
viewdeep51 0:ba33a62aea4e 988 }
viewdeep51 0:ba33a62aea4e 989 }
viewdeep51 0:ba33a62aea4e 990
viewdeep51 0:ba33a62aea4e 991
viewdeep51 0:ba33a62aea4e 992 /**************************************************************************************
viewdeep51 0:ba33a62aea4e 993 EOT Serial Data Out FUNCTIONS
viewdeep51 0:ba33a62aea4e 994 **************************************************************************************/
viewdeep51 0:ba33a62aea4e 995 uint8_t get_checksum(const char *sentence)
viewdeep51 0:ba33a62aea4e 996 {
viewdeep51 0:ba33a62aea4e 997 const char *n = sentence + 1; // Plus one, skip '$'
viewdeep51 0:ba33a62aea4e 998 uint8_t chk = 0;
viewdeep51 0:ba33a62aea4e 999
viewdeep51 0:ba33a62aea4e 1000 /* While current char isn't '*' or sentence ending (newline) */
viewdeep51 0:ba33a62aea4e 1001 while ('*' != *n && NMEA_END_CHAR_1 != *n)
viewdeep51 0:ba33a62aea4e 1002 {
viewdeep51 0:ba33a62aea4e 1003 if ('\0' == *n || n - sentence > NMEA_MAX_LENGTH)
viewdeep51 0:ba33a62aea4e 1004 {
viewdeep51 0:ba33a62aea4e 1005 /* Sentence too long or short */
viewdeep51 0:ba33a62aea4e 1006 return 0;
viewdeep51 0:ba33a62aea4e 1007 }
viewdeep51 0:ba33a62aea4e 1008 chk ^= (uint8_t) *n;
viewdeep51 0:ba33a62aea4e 1009 n++;
viewdeep51 0:ba33a62aea4e 1010 }
viewdeep51 0:ba33a62aea4e 1011
viewdeep51 0:ba33a62aea4e 1012 return chk;
viewdeep51 0:ba33a62aea4e 1013 }
viewdeep51 0:ba33a62aea4e 1014
viewdeep51 0:ba33a62aea4e 1015 void resp_HB(uint8_t seq) //presentees(submaster,slaves,listeners will respond back to the HB along with REQ and CMD ack status
viewdeep51 0:ba33a62aea4e 1016 {
viewdeep51 0:ba33a62aea4e 1017 switch(seq)
viewdeep51 0:ba33a62aea4e 1018 {
viewdeep51 0:ba33a62aea4e 1019 case 0:
viewdeep51 0:ba33a62aea4e 1020 sprintf(key,"$PEOTA,%u,%c*", addr_ID, *valid);
viewdeep51 0:ba33a62aea4e 1021 break;
viewdeep51 0:ba33a62aea4e 1022 case 1:
viewdeep51 0:ba33a62aea4e 1023 sprintf(key,"$PEOTR,%u,%u,%c*", addr_ID, req, *valid);
viewdeep51 0:ba33a62aea4e 1024 break;
viewdeep51 0:ba33a62aea4e 1025 case 2:
viewdeep51 0:ba33a62aea4e 1026 sprintf(key,"$PEOTK,%u,%u,%c*", addr_ID, ack, *valid);
viewdeep51 0:ba33a62aea4e 1027 break;
viewdeep51 0:ba33a62aea4e 1028 default:
viewdeep51 0:ba33a62aea4e 1029 sprintf(key,"$PEOTA,%u,%c*", addr_ID, *valid);
viewdeep51 0:ba33a62aea4e 1030 break;
viewdeep51 0:ba33a62aea4e 1031 }
viewdeep51 0:ba33a62aea4e 1032 checksum=get_checksum(key);
viewdeep51 0:ba33a62aea4e 1033 sprintf(key,"%u\r\n",checksum);
viewdeep51 0:ba33a62aea4e 1034 UART.printf("%s",key);
viewdeep51 0:ba33a62aea4e 1035 }
viewdeep51 0:ba33a62aea4e 1036
viewdeep51 0:ba33a62aea4e 1037 void send_ack_CMD(uint8_t _adr, uint8_t x)
viewdeep51 0:ba33a62aea4e 1038 {
viewdeep51 0:ba33a62aea4e 1039 sprintf(key,"$PEOTX,%u,%u,%c*", _adr, x, *valid);
viewdeep51 0:ba33a62aea4e 1040 checksum=get_checksum(key);
viewdeep51 0:ba33a62aea4e 1041 sprintf(key,"%u\r\n",checksum);
viewdeep51 0:ba33a62aea4e 1042 UART.printf("%s",key);
viewdeep51 0:ba33a62aea4e 1043 }
viewdeep51 0:ba33a62aea4e 1044
viewdeep51 0:ba33a62aea4e 1045 void send_CMD(uint8_t _adr)
viewdeep51 0:ba33a62aea4e 1046 { //digiit1 digit2 digit3 digit4
viewdeep51 0:ba33a62aea4e 1047 sprintf(key,"$PEOTC,%u,%u,%u,%u,%u,%c*", _adr, rpm_data[0],rpm_data[1],rpm_data[2],rpm_data[3], *valid);
viewdeep51 0:ba33a62aea4e 1048 checksum = get_checksum(key);
viewdeep51 0:ba33a62aea4e 1049 sprintf(key,"%u\r\n",checksum);
viewdeep51 0:ba33a62aea4e 1050 UART.printf("%s",key);
viewdeep51 0:ba33a62aea4e 1051 }
viewdeep51 0:ba33a62aea4e 1052
viewdeep51 0:ba33a62aea4e 1053 void send_DIR(uint8_t _adr) //addr 1-8 of leds,error=1 or 0(no error)
viewdeep51 0:ba33a62aea4e 1054 {
viewdeep51 0:ba33a62aea4e 1055 sprintf(key,"$PEOTD,%u,%u,%c*",_adr,dir,*valid); // dir is 1 for ahead, 2 for astern
viewdeep51 0:ba33a62aea4e 1056 checksum=get_checksum(key);
viewdeep51 0:ba33a62aea4e 1057 sprintf(key,"%u\r\n",checksum);
viewdeep51 0:ba33a62aea4e 1058 UART.printf("%s",key);
viewdeep51 0:ba33a62aea4e 1059 }
viewdeep51 0:ba33a62aea4e 1060
viewdeep51 0:ba33a62aea4e 1061 void send_HB(uint8_t _adr) //master will send the haertbeat to all presentees at periodic intervals
viewdeep51 0:ba33a62aea4e 1062 {
viewdeep51 0:ba33a62aea4e 1063 sprintf(key,"$PEOTH,%u,%c*", _adr, *valid);
viewdeep51 0:ba33a62aea4e 1064 checksum=get_checksum(key);
viewdeep51 0:ba33a62aea4e 1065 sprintf(key,"%u\r\n",checksum);
viewdeep51 0:ba33a62aea4e 1066 UART.printf("%s",key);
viewdeep51 0:ba33a62aea4e 1067 }
viewdeep51 0:ba33a62aea4e 1068
viewdeep51 0:ba33a62aea4e 1069 void send_BROADCAST() //addr 1-8 of leds,error=1 or 0(no error)
viewdeep51 0:ba33a62aea4e 1070 {
viewdeep51 0:ba33a62aea4e 1071 sprintf(key,"$PEOTB,%u,%u,%c*",err_ID,err_Status,*valid);
viewdeep51 0:ba33a62aea4e 1072 checksum=get_checksum(key);
viewdeep51 0:ba33a62aea4e 1073 sprintf(key,"%u\r\n",checksum);
viewdeep51 0:ba33a62aea4e 1074 UART.printf("%s",key);
viewdeep51 0:ba33a62aea4e 1075 BROADCAST_send=false;
viewdeep51 0:ba33a62aea4e 1076 }
viewdeep51 0:ba33a62aea4e 1077
viewdeep51 0:ba33a62aea4e 1078 void send_ACH()
viewdeep51 0:ba33a62aea4e 1079 {
viewdeep51 0:ba33a62aea4e 1080 sprintf(key,"$PEOTS,%u,%u,%c*", ach_M, ach_S, *valid);
viewdeep51 0:ba33a62aea4e 1081 checksum=get_checksum(key);
viewdeep51 0:ba33a62aea4e 1082 sprintf(key,"%u\r\n",checksum);
viewdeep51 0:ba33a62aea4e 1083 UART.printf("%s",key);
viewdeep51 0:ba33a62aea4e 1084 }
viewdeep51 0:ba33a62aea4e 1085
viewdeep51 0:ba33a62aea4e 1086
viewdeep51 0:ba33a62aea4e 1087 /**************************************************************************************
viewdeep51 0:ba33a62aea4e 1088 EOT Serial Data In FUNCTIONS
viewdeep51 0:ba33a62aea4e 1089 **************************************************************************************/
viewdeep51 0:ba33a62aea4e 1090 void rcvd_HB() //master check HB along with req response for all presentees
viewdeep51 0:ba33a62aea4e 1091 {
viewdeep51 0:ba33a62aea4e 1092 if(rcvd_ADDR == addr_ID) //self address received
viewdeep51 0:ba33a62aea4e 1093 {
viewdeep51 0:ba33a62aea4e 1094 if(addr_ID > pot_Slave_ER)
viewdeep51 0:ba33a62aea4e 1095 { //if no req
viewdeep51 0:ba33a62aea4e 1096 resp_HB(0); //normal HB response
viewdeep51 0:ba33a62aea4e 1097 }
viewdeep51 0:ba33a62aea4e 1098 else
viewdeep51 0:ba33a62aea4e 1099 {
viewdeep51 0:ba33a62aea4e 1100 if(req)
viewdeep51 0:ba33a62aea4e 1101 {
viewdeep51 0:ba33a62aea4e 1102 resp_HB(1); //req and ack status data in req=1 and ack=2 if true
viewdeep51 0:ba33a62aea4e 1103 req = 0;
viewdeep51 0:ba33a62aea4e 1104 }
viewdeep51 0:ba33a62aea4e 1105 else if(ack)
viewdeep51 0:ba33a62aea4e 1106 {
viewdeep51 0:ba33a62aea4e 1107 resp_HB(2); //req and ack status data in req=1 and ack=2 if true
viewdeep51 0:ba33a62aea4e 1108 ack = 0;
viewdeep51 0:ba33a62aea4e 1109 }
viewdeep51 0:ba33a62aea4e 1110 else
viewdeep51 0:ba33a62aea4e 1111 resp_HB(0); //req and ack status data in req=1 and ack=2 if true
viewdeep51 0:ba33a62aea4e 1112 }
viewdeep51 0:ba33a62aea4e 1113 }
viewdeep51 0:ba33a62aea4e 1114 else
viewdeep51 0:ba33a62aea4e 1115 __nop();
viewdeep51 0:ba33a62aea4e 1116 }
viewdeep51 0:ba33a62aea4e 1117
viewdeep51 0:ba33a62aea4e 1118 void resp_rcvd_HB() //master and active/passive slaves check HB response along with req/ack commands
viewdeep51 0:ba33a62aea4e 1119 {
viewdeep51 0:ba33a62aea4e 1120 if(addr_ID == eot_Master) //only master will be able to monitor status of all eots connected
viewdeep51 0:ba33a62aea4e 1121 {
viewdeep51 0:ba33a62aea4e 1122 if(send_ADDR == rcvd_ADDR)
viewdeep51 0:ba33a62aea4e 1123 HB_ack_rcvd = true;
viewdeep51 0:ba33a62aea4e 1124 else
viewdeep51 0:ba33a62aea4e 1125 HB_ack_rcvd = false;
viewdeep51 0:ba33a62aea4e 1126 }
viewdeep51 0:ba33a62aea4e 1127 else
viewdeep51 0:ba33a62aea4e 1128 __nop();
viewdeep51 0:ba33a62aea4e 1129 }
viewdeep51 0:ba33a62aea4e 1130
viewdeep51 0:ba33a62aea4e 1131 void rcvd_rpm_CMD() //all devices check for received command
viewdeep51 0:ba33a62aea4e 1132 {
viewdeep51 0:ba33a62aea4e 1133 for(uint8_t i = 0; i >= 3 ; i--)
viewdeep51 0:ba33a62aea4e 1134 {
viewdeep51 0:ba33a62aea4e 1135 max7219.write_digit(1,i+1,rpm_data[i]); //disp1 //data 0 means left most digit will be blank bcoz no decode mode is used
viewdeep51 0:ba33a62aea4e 1136 }
viewdeep51 0:ba33a62aea4e 1137 buzzer = _ON; //buzzer on
viewdeep51 0:ba33a62aea4e 1138 if(ach_S == addr_ID)
viewdeep51 0:ba33a62aea4e 1139 {
viewdeep51 0:ba33a62aea4e 1140 int_B.rise(&read_KEY_B); //portc is always enbaled in all cases and PORTA is enabled only for active master
viewdeep51 0:ba33a62aea4e 1141 }
viewdeep51 0:ba33a62aea4e 1142 else
viewdeep51 0:ba33a62aea4e 1143 {
viewdeep51 0:ba33a62aea4e 1144 __nop();
viewdeep51 0:ba33a62aea4e 1145 }
viewdeep51 0:ba33a62aea4e 1146 if(addr_ID == rcvd_ADDR) //particular device responds cmd_ack
viewdeep51 0:ba33a62aea4e 1147 {
viewdeep51 0:ba33a62aea4e 1148 resp_HB(0); //CMD_ack or response with PEOTA syntax send by devices as per their addresss
viewdeep51 0:ba33a62aea4e 1149 }
viewdeep51 0:ba33a62aea4e 1150 else
viewdeep51 0:ba33a62aea4e 1151 {
viewdeep51 0:ba33a62aea4e 1152 __nop();
viewdeep51 0:ba33a62aea4e 1153 }
viewdeep51 0:ba33a62aea4e 1154
viewdeep51 0:ba33a62aea4e 1155 disp_FLASH.attach(&DISP_FLASH,0.50); //disp1 flash timer started in all connected devices except master
viewdeep51 0:ba33a62aea4e 1156 CMD_Ticker.attach(&CMD_State_Machine,0.25); //state machine timer started in all connected devices except master
viewdeep51 0:ba33a62aea4e 1157 }
viewdeep51 0:ba33a62aea4e 1158 void rcvd_dir_CMD() //all devices check for received command
viewdeep51 0:ba33a62aea4e 1159 {
viewdeep51 0:ba33a62aea4e 1160 rcvd_DIR = true;
viewdeep51 0:ba33a62aea4e 1161 LED_DIR[last_dir-1].OFF();
viewdeep51 0:ba33a62aea4e 1162 LED_DIR[dir-1].FLASHH(); //led flash started
viewdeep51 0:ba33a62aea4e 1163 buzzer = _ON; //buzzer on
viewdeep51 0:ba33a62aea4e 1164 last_dir = dir;
viewdeep51 0:ba33a62aea4e 1165 //ACK_pending = true; //HB-cmd ack pending with "A"
viewdeep51 0:ba33a62aea4e 1166 DIR_Ticker.attach(&DIR_State_Machine,0.25); //state machine timer started in all connected devices
viewdeep51 0:ba33a62aea4e 1167 if(ach_S == addr_ID)
viewdeep51 0:ba33a62aea4e 1168 {
viewdeep51 0:ba33a62aea4e 1169 int_B.rise(&read_KEY_B); //enable keys bcoz ahead/astern keys co-grouped to PORTB of mcp23s17(1)
viewdeep51 0:ba33a62aea4e 1170 }
viewdeep51 0:ba33a62aea4e 1171 }
viewdeep51 0:ba33a62aea4e 1172
viewdeep51 0:ba33a62aea4e 1173 void rcvd_BROADCAST()
viewdeep51 0:ba33a62aea4e 1174 {
viewdeep51 0:ba33a62aea4e 1175 if(err_Status==1) //err non zero
viewdeep51 0:ba33a62aea4e 1176 {
viewdeep51 0:ba33a62aea4e 1177 LED_ACH[err_ID].FLASHH();
viewdeep51 0:ba33a62aea4e 1178 }
viewdeep51 0:ba33a62aea4e 1179 else
viewdeep51 0:ba33a62aea4e 1180 {
viewdeep51 0:ba33a62aea4e 1181 LED_ACH[err_ID].OFF();
viewdeep51 0:ba33a62aea4e 1182 }
viewdeep51 0:ba33a62aea4e 1183
viewdeep51 0:ba33a62aea4e 1184 }
viewdeep51 0:ba33a62aea4e 1185
viewdeep51 0:ba33a62aea4e 1186 void read_SERIAL()
viewdeep51 0:ba33a62aea4e 1187 {
viewdeep51 0:ba33a62aea4e 1188 UART.scanf("%s",key);
viewdeep51 0:ba33a62aea4e 1189 strtok(key,",");
viewdeep51 0:ba33a62aea4e 1190 if(strcmp(key,"$PEOTH") == 0) //* present submaster,Slaves or lsitners receive HB *//
viewdeep51 0:ba33a62aea4e 1191 {
viewdeep51 0:ba33a62aea4e 1192 sscanf(strtok (NULL,","), "%u", &rcvd_ADDR); //address of connected device
viewdeep51 0:ba33a62aea4e 1193 rcvd_HB(); //set flag when Heartbeat received
viewdeep51 0:ba33a62aea4e 1194 }
viewdeep51 0:ba33a62aea4e 1195 else if(strcmp(key,"$PEOTA") == 0) //* Master,submaster and Slaves receive heartbeat resp *//
viewdeep51 0:ba33a62aea4e 1196 {
viewdeep51 0:ba33a62aea4e 1197 sscanf(strtok (NULL,","), "%u", &rcvd_ADDR);
viewdeep51 0:ba33a62aea4e 1198 if(RPM_cmd_ack && addr_ID == ach_S) //ENTER_ACK key here is detected from active slave
viewdeep51 0:ba33a62aea4e 1199 {
viewdeep51 0:ba33a62aea4e 1200 send_ack_CMD(addr_ID,RPM); //PEOTX,addr_ID,R(for RPM)
viewdeep51 0:ba33a62aea4e 1201 CMD_ack_send = true;
viewdeep51 0:ba33a62aea4e 1202 RPM_cmd_ack = false; //in active slave
viewdeep51 0:ba33a62aea4e 1203 }
viewdeep51 0:ba33a62aea4e 1204 else if(DIR_cmd_ack && addr_ID == ach_S)
viewdeep51 0:ba33a62aea4e 1205 {
viewdeep51 0:ba33a62aea4e 1206 send_ack_CMD(addr_ID,DIR); //PEOTX,addr_ID,D(for direction)
viewdeep51 0:ba33a62aea4e 1207 DIR_cmd_ack = false;
viewdeep51 0:ba33a62aea4e 1208 DIR_Ticker.detach(); //DIR_state_machine suspended in active slave
viewdeep51 0:ba33a62aea4e 1209 }
viewdeep51 0:ba33a62aea4e 1210 else
viewdeep51 0:ba33a62aea4e 1211 resp_rcvd_HB();
viewdeep51 0:ba33a62aea4e 1212 }
viewdeep51 0:ba33a62aea4e 1213 else if(strcmp(key,"$PEOTB") == 0) //* submaster,Slaves or listener receive broadcast *//
viewdeep51 0:ba33a62aea4e 1214 {
viewdeep51 0:ba33a62aea4e 1215 sscanf(strtok (NULL,","), "%u", &err_ID); //cmd extracted
viewdeep51 0:ba33a62aea4e 1216 sscanf(strtok (NULL,","), "%u", &err_Status);
viewdeep51 0:ba33a62aea4e 1217 rcvd_BROADCAST();
viewdeep51 0:ba33a62aea4e 1218 }
viewdeep51 0:ba33a62aea4e 1219 else if(strcmp(key,"$PEOTC") == 0) //* submaster,Slaves or listener receive CMD *//
viewdeep51 0:ba33a62aea4e 1220 {
viewdeep51 0:ba33a62aea4e 1221 sscanf(strtok (NULL,","), "%u", &rcvd_ADDR); //address extracted
viewdeep51 0:ba33a62aea4e 1222 sscanf(strtok (NULL,","), "%u", &rpm_data[0]); //rpm data digit 1 and soon
viewdeep51 0:ba33a62aea4e 1223 sscanf(strtok (NULL,","), "%u", &rpm_data[1]);
viewdeep51 0:ba33a62aea4e 1224 sscanf(strtok (NULL,","), "%u", &rpm_data[2]);
viewdeep51 0:ba33a62aea4e 1225 sscanf(strtok (NULL,","), "%u", &rpm_data[3]);
viewdeep51 0:ba33a62aea4e 1226 CMD_rcvd = true;
viewdeep51 0:ba33a62aea4e 1227 rcvd_rpm_CMD();
viewdeep51 0:ba33a62aea4e 1228 }
viewdeep51 0:ba33a62aea4e 1229 else if(strcmp(key,"$PEOTD") == 0) //* present submaster,Slaves or lsitners receive HB *//
viewdeep51 0:ba33a62aea4e 1230 {
viewdeep51 0:ba33a62aea4e 1231 sscanf(strtok (NULL,","), "%u", &rcvd_ADDR); //address of connected device
viewdeep51 0:ba33a62aea4e 1232 sscanf(strtok (NULL,","), "%u", &dir); // 1 for ahead and 2 for astern
viewdeep51 0:ba33a62aea4e 1233 rcvd_dir_CMD(); //set flag when Heartbeat received
viewdeep51 0:ba33a62aea4e 1234 }
viewdeep51 0:ba33a62aea4e 1235 else if(strcmp(key,"$PEOTX") == 0) //* Master,submaster,Slave or listners receive CMD acknowledge *//
viewdeep51 0:ba33a62aea4e 1236 {
viewdeep51 0:ba33a62aea4e 1237 sscanf(strtok (NULL,","), "%u", &rcvd_ADDR); //addr extracted
viewdeep51 0:ba33a62aea4e 1238 sscanf(strtok (NULL,","), "%u", &ack_rpm_dir); //ack extracted
viewdeep51 0:ba33a62aea4e 1239
viewdeep51 0:ba33a62aea4e 1240 if(ack_rpm_dir == RPM)
viewdeep51 0:ba33a62aea4e 1241 RPM_cmd_ack = true;
viewdeep51 0:ba33a62aea4e 1242 else if (ack_rpm_dir == DIR)
viewdeep51 0:ba33a62aea4e 1243 DIR_cmd_ack = true;
viewdeep51 0:ba33a62aea4e 1244 else
viewdeep51 0:ba33a62aea4e 1245 __nop();
viewdeep51 0:ba33a62aea4e 1246 }
viewdeep51 0:ba33a62aea4e 1247 else if(strcmp(key,"$PEOTS") == 0) //*active channel status recieved *//
viewdeep51 0:ba33a62aea4e 1248 {
viewdeep51 0:ba33a62aea4e 1249 int _M = ach_M;
viewdeep51 0:ba33a62aea4e 1250 int _S = ach_S;
viewdeep51 0:ba33a62aea4e 1251 sscanf(strtok (NULL,","), "%u", &ach_M); //cmd extracted
viewdeep51 0:ba33a62aea4e 1252 sscanf(strtok (NULL,","), "%u", &ach_S);
viewdeep51 0:ba33a62aea4e 1253 if(_M != ach_M)
viewdeep51 0:ba33a62aea4e 1254 {
viewdeep51 0:ba33a62aea4e 1255 LED_ACH[ach_M-1].ON(); //TODO in case of master submaster PORTA,B needs to be enabled/disabled
viewdeep51 0:ba33a62aea4e 1256 LED_ACH[_M-1].OFF(); // along with HB_ticker attach/detach
viewdeep51 0:ba33a62aea4e 1257 }
viewdeep51 0:ba33a62aea4e 1258 else if(_S != ach_S)
viewdeep51 0:ba33a62aea4e 1259 {
viewdeep51 0:ba33a62aea4e 1260 LED_ACH[ach_S-1].ON();
viewdeep51 0:ba33a62aea4e 1261 LED_ACH[_S-1].OFF();
viewdeep51 0:ba33a62aea4e 1262 }
viewdeep51 0:ba33a62aea4e 1263 else
viewdeep51 0:ba33a62aea4e 1264 __nop();
viewdeep51 0:ba33a62aea4e 1265 }
viewdeep51 0:ba33a62aea4e 1266 else if(strcmp(key,"$PEOTR") == 0) //* control transfer request arrived*//
viewdeep51 0:ba33a62aea4e 1267 {
viewdeep51 0:ba33a62aea4e 1268 sscanf(strtok (NULL,","), "%u", &rcvd_ADDR);
viewdeep51 0:ba33a62aea4e 1269 sscanf(strtok (NULL,","), "%u", &req); //e.g $R req or $K ack
viewdeep51 0:ba33a62aea4e 1270 if(addr_ID < eot_Slave_ER)
viewdeep51 0:ba33a62aea4e 1271 {
viewdeep51 0:ba33a62aea4e 1272 REQ_rcvd = true;
viewdeep51 0:ba33a62aea4e 1273 req_ADDR = rcvd_ADDR;
viewdeep51 0:ba33a62aea4e 1274 R_A_Ticker.attach(&R_A_Statemachine,0.5);
viewdeep51 0:ba33a62aea4e 1275 if((rcvd_ADDR == eot_Master || rcvd_ADDR == eot_Submaster) && (addr_ID == eot_Master || addr_ID == eot_Submaster))
viewdeep51 0:ba33a62aea4e 1276 {
viewdeep51 0:ba33a62aea4e 1277 LED_CTRL[ACK_-1].FLASHH(); //ack led blink
viewdeep51 0:ba33a62aea4e 1278 }
viewdeep51 0:ba33a62aea4e 1279 else if((rcvd_ADDR == eot_Slave_ER || rcvd_ADDR == eot_Slave_MCR) && (addr_ID == eot_Slave_ER || addr_ID == eot_Slave_MCR))
viewdeep51 0:ba33a62aea4e 1280 {
viewdeep51 0:ba33a62aea4e 1281 LED_CTRL[ACK_-1].FLASHH(); //ack led blink
viewdeep51 0:ba33a62aea4e 1282 }
viewdeep51 0:ba33a62aea4e 1283 else
viewdeep51 0:ba33a62aea4e 1284 __nop();
viewdeep51 0:ba33a62aea4e 1285 }
viewdeep51 0:ba33a62aea4e 1286 else
viewdeep51 0:ba33a62aea4e 1287 __nop();
viewdeep51 0:ba33a62aea4e 1288 }
viewdeep51 0:ba33a62aea4e 1289 else if(strcmp(key,"$PEOTK") == 0) //* Master,submaster,Slave or listners receive CMD acknowledge *//
viewdeep51 0:ba33a62aea4e 1290 {
viewdeep51 0:ba33a62aea4e 1291 sscanf(strtok (NULL,","), "%u", &rcvd_ADDR);
viewdeep51 0:ba33a62aea4e 1292 sscanf(strtok (NULL,","), "%u", &ack); //e.g $R req or $K ack
viewdeep51 0:ba33a62aea4e 1293 ACK_rcvd = true;
viewdeep51 0:ba33a62aea4e 1294 if(addr_ID < eot_Slave_ER)
viewdeep51 0:ba33a62aea4e 1295 {
viewdeep51 0:ba33a62aea4e 1296 ack_ADDR = rcvd_ADDR;
viewdeep51 0:ba33a62aea4e 1297 ACK_rcvd = true;
viewdeep51 0:ba33a62aea4e 1298 ACH_SW_over = true;
viewdeep51 0:ba33a62aea4e 1299
viewdeep51 0:ba33a62aea4e 1300 if((rcvd_ADDR == eot_Master || rcvd_ADDR == eot_Submaster) && (addr_ID == eot_Master || addr_ID == eot_Submaster))
viewdeep51 0:ba33a62aea4e 1301 LED_CTRL[ACK_-1].OFF();
viewdeep51 0:ba33a62aea4e 1302 else if((rcvd_ADDR == eot_Slave_ER || rcvd_ADDR == eot_Slave_MCR) && (addr_ID == eot_Slave_ER || addr_ID == eot_Slave_MCR))
viewdeep51 0:ba33a62aea4e 1303 LED_CTRL[ACK_-1].OFF();
viewdeep51 0:ba33a62aea4e 1304 else
viewdeep51 0:ba33a62aea4e 1305 __nop();
viewdeep51 0:ba33a62aea4e 1306 }
viewdeep51 0:ba33a62aea4e 1307 else
viewdeep51 0:ba33a62aea4e 1308 __nop();
viewdeep51 0:ba33a62aea4e 1309 }
viewdeep51 0:ba33a62aea4e 1310 }
viewdeep51 0:ba33a62aea4e 1311
viewdeep51 0:ba33a62aea4e 1312 /**************************************************************************************
viewdeep51 0:ba33a62aea4e 1313 EOT Handler FUNCTIONS
viewdeep51 0:ba33a62aea4e 1314 **************************************************************************************/
viewdeep51 0:ba33a62aea4e 1315 void HB_handler() //function run periodically within active master only
viewdeep51 0:ba33a62aea4e 1316 {
viewdeep51 0:ba33a62aea4e 1317 if(addr_ID == ach_M) //function run only in active master
viewdeep51 0:ba33a62aea4e 1318 {
viewdeep51 0:ba33a62aea4e 1319 if(ach_M == eot_Master)
viewdeep51 0:ba33a62aea4e 1320 {
viewdeep51 0:ba33a62aea4e 1321 device_addr++;
viewdeep51 0:ba33a62aea4e 1322 if(device_addr >= no_eot_connected)
viewdeep51 0:ba33a62aea4e 1323 device_addr = 0;
viewdeep51 0:ba33a62aea4e 1324 }
viewdeep51 0:ba33a62aea4e 1325 else
viewdeep51 0:ba33a62aea4e 1326 __nop();
viewdeep51 0:ba33a62aea4e 1327 /*else if(ach_M == eot_Submaster)
viewdeep51 0:ba33a62aea4e 1328 {
viewdeep51 0:ba33a62aea4e 1329 if(device_addr==2)
viewdeep51 0:ba33a62aea4e 1330 {
viewdeep51 0:ba33a62aea4e 1331 device_addr=3;
viewdeep51 0:ba33a62aea4e 1332 }
viewdeep51 0:ba33a62aea4e 1333 else
viewdeep51 0:ba33a62aea4e 1334 {
viewdeep51 0:ba33a62aea4e 1335 device_addr++;
viewdeep51 0:ba33a62aea4e 1336 if(device_addr>NO_MAX_EOT)
viewdeep51 0:ba33a62aea4e 1337 device_addr=1;
viewdeep51 0:ba33a62aea4e 1338 }
viewdeep51 0:ba33a62aea4e 1339 }
viewdeep51 0:ba33a62aea4e 1340 */
viewdeep51 0:ba33a62aea4e 1341 send_ADDR = EOT[device_addr].slave_ID;
viewdeep51 0:ba33a62aea4e 1342 if(RPM_cmd)
viewdeep51 0:ba33a62aea4e 1343 {
viewdeep51 0:ba33a62aea4e 1344 send_CMD(send_ADDR); //cmd to be send with current running address and rpm data value
viewdeep51 0:ba33a62aea4e 1345 HB_Ticker.attach(&HB_State_Machine,0.010); //HB_state_machine runing for CMD_ack with PEOTA sentence in master only
viewdeep51 0:ba33a62aea4e 1346 CMD_Ticker.attach(&CMD_State_Machine,0.25); //CMD_state_machine ticker started in master only
viewdeep51 0:ba33a62aea4e 1347 }
viewdeep51 0:ba33a62aea4e 1348 else if(DIR_cmd)
viewdeep51 0:ba33a62aea4e 1349 {
viewdeep51 0:ba33a62aea4e 1350 send_CMD(send_ADDR);
viewdeep51 0:ba33a62aea4e 1351 HB_Ticker.attach(&HB_State_Machine,0.010);
viewdeep51 0:ba33a62aea4e 1352 DIR_Ticker.attach(&DIR_State_Machine,0.25);
viewdeep51 0:ba33a62aea4e 1353 }
viewdeep51 0:ba33a62aea4e 1354 else if(BROADCAST_send)
viewdeep51 0:ba33a62aea4e 1355 {
viewdeep51 0:ba33a62aea4e 1356 send_BROADCAST(); //broadcast needed err_ID nd err_Status
viewdeep51 0:ba33a62aea4e 1357 BROADCAST_send = false;
viewdeep51 0:ba33a62aea4e 1358 }
viewdeep51 0:ba33a62aea4e 1359 else if(switch_CH) //active channel switch over happened
viewdeep51 0:ba33a62aea4e 1360 {
viewdeep51 0:ba33a62aea4e 1361 send_ACH(); //active channel changeover
viewdeep51 0:ba33a62aea4e 1362 switch_CH = false;
viewdeep51 0:ba33a62aea4e 1363 }
viewdeep51 0:ba33a62aea4e 1364 else
viewdeep51 0:ba33a62aea4e 1365 {
viewdeep51 0:ba33a62aea4e 1366 cmd=0x0;
viewdeep51 0:ba33a62aea4e 1367 send_HB(send_ADDR); //hb is to be going on
viewdeep51 0:ba33a62aea4e 1368 HB_ticker.attach(&HB_State_Machine,0.010); //HB_state_machine timer started
viewdeep51 0:ba33a62aea4e 1369 }
viewdeep51 0:ba33a62aea4e 1370 }
viewdeep51 0:ba33a62aea4e 1371 else
viewdeep51 0:ba33a62aea4e 1372 __nop();
viewdeep51 0:ba33a62aea4e 1373 }
viewdeep51 0:ba33a62aea4e 1374
viewdeep51 0:ba33a62aea4e 1375
viewdeep51 0:ba33a62aea4e 1376
viewdeep51 0:ba33a62aea4e 1377 /**************************************************************************************
viewdeep51 0:ba33a62aea4e 1378 EOT config FUNCTIONS
viewdeep51 0:ba33a62aea4e 1379 **************************************************************************************/
viewdeep51 0:ba33a62aea4e 1380 void read_POT_ADDR() //function give present eots and no. of connected eots
viewdeep51 0:ba33a62aea4e 1381 {
viewdeep51 0:ba33a62aea4e 1382 pot_Addr = read_KEY_SPI(ch_D);
viewdeep51 0:ba33a62aea4e 1383
viewdeep51 0:ba33a62aea4e 1384 if(pot_Addr==0xff) //if 0xff it means no addressing done
viewdeep51 0:ba33a62aea4e 1385 pot_Error=true;
viewdeep51 0:ba33a62aea4e 1386 else if(pot_Addr!=0xff)
viewdeep51 0:ba33a62aea4e 1387 {
viewdeep51 0:ba33a62aea4e 1388 for( uint8_t i=0;i<=7;i++)
viewdeep51 0:ba33a62aea4e 1389 {
viewdeep51 0:ba33a62aea4e 1390 if(((1 << i) & pot_Addr)== 0) // to check which bit of eot_Addr register is '0'
viewdeep51 0:ba33a62aea4e 1391 {
viewdeep51 0:ba33a62aea4e 1392 if(i==0) // bit 0 means master present and soon
viewdeep51 0:ba33a62aea4e 1393 {
viewdeep51 0:ba33a62aea4e 1394 addr_ID = pot_Master;
viewdeep51 0:ba33a62aea4e 1395 ach_M = pot_Master;
viewdeep51 0:ba33a62aea4e 1396 for(i = 1 ; i <= 7 ; i++)
viewdeep51 0:ba33a62aea4e 1397 {
viewdeep51 0:ba33a62aea4e 1398 if((((uint8_t)1<<i) & pot_Addr) == 0)
viewdeep51 0:ba33a62aea4e 1399 {
viewdeep51 0:ba33a62aea4e 1400 switch(i)
viewdeep51 0:ba33a62aea4e 1401 {
viewdeep51 0:ba33a62aea4e 1402 case 1:
viewdeep51 0:ba33a62aea4e 1403 POT[no_pot_connected].slave_ID = pot_Submaster;
viewdeep51 0:ba33a62aea4e 1404 POT[no_pot_connected].err_cnt=0;
viewdeep51 0:ba33a62aea4e 1405 no_eot_connected++;
viewdeep51 0:ba33a62aea4e 1406 break;
viewdeep51 0:ba33a62aea4e 1407 case 2:
viewdeep51 0:ba33a62aea4e 1408 ach_S = pot_Slave_MCR;
viewdeep51 0:ba33a62aea4e 1409 POT[no_pot_connected].slave_ID = pot_Slave_MCR;
viewdeep51 0:ba33a62aea4e 1410 POT[no_pot_connected].err_cnt=0;
viewdeep51 0:ba33a62aea4e 1411 no_pot_connected++;
viewdeep51 0:ba33a62aea4e 1412 break;
viewdeep51 0:ba33a62aea4e 1413 case 3:
viewdeep51 0:ba33a62aea4e 1414 if(ach_S == pot_Slave_MCR) //if MCR ispresent
viewdeep51 0:ba33a62aea4e 1415 __nop();
viewdeep51 0:ba33a62aea4e 1416 else
viewdeep51 0:ba33a62aea4e 1417 { //if MCR is not present
viewdeep51 0:ba33a62aea4e 1418 ach_S = pot_Slave_ER;
viewdeep51 0:ba33a62aea4e 1419 }
viewdeep51 0:ba33a62aea4e 1420 POT[no_pot_connected].slave_ID = pot_Slave_ER;
viewdeep51 0:ba33a62aea4e 1421 POT[no_pot_connected].err_cnt = 0;
viewdeep51 0:ba33a62aea4e 1422 no_pot_connected++;
viewdeep51 0:ba33a62aea4e 1423 break;
viewdeep51 0:ba33a62aea4e 1424 case 4:
viewdeep51 0:ba33a62aea4e 1425 POT[no_pot_connected].slave_ID = pot_Listner_WP;
viewdeep51 0:ba33a62aea4e 1426 POT[no_pot_connected].err_cnt = 0;
viewdeep51 0:ba33a62aea4e 1427 no_pot_connected++;
viewdeep51 0:ba33a62aea4e 1428 break;
viewdeep51 0:ba33a62aea4e 1429 case 5:
viewdeep51 0:ba33a62aea4e 1430 POT[no_pot_connected].slave_ID = pot_Listner_WS;
viewdeep51 0:ba33a62aea4e 1431 POT[no_pot_connected].err_cnt=0;
viewdeep51 0:ba33a62aea4e 1432 no_pot_connected++;
viewdeep51 0:ba33a62aea4e 1433 break;
viewdeep51 0:ba33a62aea4e 1434 case 6:
viewdeep51 0:ba33a62aea4e 1435 POT[no_pot_connected].slave_ID = pot_Listner_OPS;
viewdeep51 0:ba33a62aea4e 1436 POT[no_pot_connected].err_cnt=0;
viewdeep51 0:ba33a62aea4e 1437 no_pot_connected++;
viewdeep51 0:ba33a62aea4e 1438 break;
viewdeep51 0:ba33a62aea4e 1439 case 7:
viewdeep51 0:ba33a62aea4e 1440 POT[no_pot_connected].slave_ID = pot_Listner_ASP;
viewdeep51 0:ba33a62aea4e 1441 POT[no_pot_connected].err_cnt=0;
viewdeep51 0:ba33a62aea4e 1442 no_pot_connected++;
viewdeep51 0:ba33a62aea4e 1443 break;
viewdeep51 0:ba33a62aea4e 1444 }
viewdeep51 0:ba33a62aea4e 1445 }
viewdeep51 0:ba33a62aea4e 1446 }
viewdeep51 0:ba33a62aea4e 1447 }
viewdeep51 0:ba33a62aea4e 1448 else
viewdeep51 0:ba33a62aea4e 1449 {
viewdeep51 0:ba33a62aea4e 1450 switch(i)
viewdeep51 0:ba33a62aea4e 1451 {
viewdeep51 0:ba33a62aea4e 1452 case 1:
viewdeep51 0:ba33a62aea4e 1453 {
viewdeep51 0:ba33a62aea4e 1454 addr_ID = pot_Submaster;
viewdeep51 0:ba33a62aea4e 1455 break;
viewdeep51 0:ba33a62aea4e 1456 }
viewdeep51 0:ba33a62aea4e 1457 case 2:
viewdeep51 0:ba33a62aea4e 1458 {
viewdeep51 0:ba33a62aea4e 1459 addr_ID = pot_Slave_MCR;
viewdeep51 0:ba33a62aea4e 1460 break;
viewdeep51 0:ba33a62aea4e 1461 }
viewdeep51 0:ba33a62aea4e 1462 case 3:
viewdeep51 0:ba33a62aea4e 1463 {
viewdeep51 0:ba33a62aea4e 1464 addr_ID = pot_Slave_ER;
viewdeep51 0:ba33a62aea4e 1465 break;
viewdeep51 0:ba33a62aea4e 1466 }
viewdeep51 0:ba33a62aea4e 1467 case 4:
viewdeep51 0:ba33a62aea4e 1468 {
viewdeep51 0:ba33a62aea4e 1469 addr_ID = pot_Listner_WP;
viewdeep51 0:ba33a62aea4e 1470 break;
viewdeep51 0:ba33a62aea4e 1471 }
viewdeep51 0:ba33a62aea4e 1472 case 5:
viewdeep51 0:ba33a62aea4e 1473 {
viewdeep51 0:ba33a62aea4e 1474 addr_ID = pot_Listner_WS;
viewdeep51 0:ba33a62aea4e 1475 break;
viewdeep51 0:ba33a62aea4e 1476 }
viewdeep51 0:ba33a62aea4e 1477 case 6:
viewdeep51 0:ba33a62aea4e 1478 {
viewdeep51 0:ba33a62aea4e 1479 addr_ID = pot_Listner_OPS;
viewdeep51 0:ba33a62aea4e 1480 break;
viewdeep51 0:ba33a62aea4e 1481 }
viewdeep51 0:ba33a62aea4e 1482 case 7:
viewdeep51 0:ba33a62aea4e 1483 {
viewdeep51 0:ba33a62aea4e 1484 addr_ID = pot_Listner_ASP;
viewdeep51 0:ba33a62aea4e 1485 break;
viewdeep51 0:ba33a62aea4e 1486 }
viewdeep51 0:ba33a62aea4e 1487 default:
viewdeep51 0:ba33a62aea4e 1488 pot_Error = true;
viewdeep51 0:ba33a62aea4e 1489 }
viewdeep51 0:ba33a62aea4e 1490 }
viewdeep51 0:ba33a62aea4e 1491 }
viewdeep51 0:ba33a62aea4e 1492 }
viewdeep51 0:ba33a62aea4e 1493 }
viewdeep51 0:ba33a62aea4e 1494 }
viewdeep51 0:ba33a62aea4e 1495
viewdeep51 0:ba33a62aea4e 1496 void Uart_Init()
viewdeep51 0:ba33a62aea4e 1497 { //buffer initialisation
viewdeep51 0:ba33a62aea4e 1498 Serial UART(SERIAL_TX, SERIAL_RX);
viewdeep51 0:ba33a62aea4e 1499 UART.baud(9600);
viewdeep51 0:ba33a62aea4e 1500 UART.format(8,SerialBase::None,1);
viewdeep51 0:ba33a62aea4e 1501 //UART.attach( &read_SERIAL, UART.RxIrq); //receive interrupt enabled
viewdeep51 0:ba33a62aea4e 1502 }
viewdeep51 0:ba33a62aea4e 1503
viewdeep51 0:ba33a62aea4e 1504
viewdeep51 0:ba33a62aea4e 1505 void Spi3_Init() //for mcp23s17
viewdeep51 0:ba33a62aea4e 1506 {
viewdeep51 0:ba33a62aea4e 1507 _SPI3.format(8,0); //8bit,mode 0
viewdeep51 0:ba33a62aea4e 1508 _SPI3.frequency(1000000); //1mhz
viewdeep51 0:ba33a62aea4e 1509 }
viewdeep51 0:ba33a62aea4e 1510
viewdeep51 0:ba33a62aea4e 1511 void mcp23s17_init()
viewdeep51 0:ba33a62aea4e 1512 {
viewdeep51 0:ba33a62aea4e 1513 //device1 configuration
viewdeep51 0:ba33a62aea4e 1514 mcp23s17_1.reset(); //reset on power-up
viewdeep51 0:ba33a62aea4e 1515 mcp23s17_1.iodira(0xff); //set 8-bits PORTA as inputs
viewdeep51 0:ba33a62aea4e 1516 mcp23s17_1.iodirb(0xff); //set 8-bits PORTb as inputs
viewdeep51 0:ba33a62aea4e 1517 mcp23s17_1.ipola(0x00);
viewdeep51 0:ba33a62aea4e 1518 mcp23s17_1.ipolb(0x00);
viewdeep51 0:ba33a62aea4e 1519 mcp23s17_1.gpintena(0xff); //interrupt enabled on PORTA
viewdeep51 0:ba33a62aea4e 1520 mcp23s17_1.gpintenb(0xff); //interrupt enabled on PORTB
viewdeep51 0:ba33a62aea4e 1521 mcp23s17_1.defvala(0xff);
viewdeep51 0:ba33a62aea4e 1522 mcp23s17_1.defvalb(0xff);
viewdeep51 0:ba33a62aea4e 1523 mcp23s17_1.intcona(0x2a); //bank0,mirror disabled, SEQOP disabled, slew rate disabled,HAEN enabled,open drain enabled,interrupt active high,not allowed
viewdeep51 0:ba33a62aea4e 1524 mcp23s17_1.intconb(0x2a);
viewdeep51 0:ba33a62aea4e 1525 mcp23s17_1.gppua(0xff);
viewdeep51 0:ba33a62aea4e 1526 mcp23s17_1.gppub(0xff);
viewdeep51 0:ba33a62aea4e 1527
viewdeep51 0:ba33a62aea4e 1528 //device2 configuration
viewdeep51 0:ba33a62aea4e 1529 mcp23s17_2.reset(); //reset on power-up
viewdeep51 0:ba33a62aea4e 1530 mcp23s17_2.iodira(0xff); //set 8-bits PORTA as inputs
viewdeep51 0:ba33a62aea4e 1531 mcp23s17_2.iodirb(0xff); //set 8-bits PORTb as inputs
viewdeep51 0:ba33a62aea4e 1532 mcp23s17_2.ipola(0x00);
viewdeep51 0:ba33a62aea4e 1533 mcp23s17_2.ipolb(0x00);
viewdeep51 0:ba33a62aea4e 1534 mcp23s17_2.gpintena(0xff); //interrupt enabled on PORTA
viewdeep51 0:ba33a62aea4e 1535 mcp23s17_2.gpintenb(0x00); //interrupts disabled for address PORTB
viewdeep51 0:ba33a62aea4e 1536 mcp23s17_2.defvala(0xff);
viewdeep51 0:ba33a62aea4e 1537 mcp23s17_2.defvalb(0xff);
viewdeep51 0:ba33a62aea4e 1538 mcp23s17_2.intcona(0x2a); //bank0,mirror disabled, SEQOP disabled, slew rate disabled,HAEN enabled,open drain enabled,interrupt active high,not allowed
viewdeep51 0:ba33a62aea4e 1539 mcp23s17_2.intconb(0x2a);
viewdeep51 0:ba33a62aea4e 1540 mcp23s17_2.gppua(0xff);
viewdeep51 0:ba33a62aea4e 1541 mcp23s17_2.gppub(0xff);
viewdeep51 0:ba33a62aea4e 1542 }
viewdeep51 0:ba33a62aea4e 1543
viewdeep51 0:ba33a62aea4e 1544 void Spi2_Init() // for max7219
viewdeep51 0:ba33a62aea4e 1545 {
viewdeep51 0:ba33a62aea4e 1546 _SPI2.format(16,0); //16bit,mode 0
viewdeep51 0:ba33a62aea4e 1547 _SPI2.frequency(1000000); //1mhz
viewdeep51 0:ba33a62aea4e 1548 }
viewdeep51 0:ba33a62aea4e 1549
viewdeep51 0:ba33a62aea4e 1550 void max7219_init()
viewdeep51 0:ba33a62aea4e 1551 {
viewdeep51 0:ba33a62aea4e 1552 max7219.set_num_devices(2); //total 02 no. of devices which will drive 03 displays
viewdeep51 0:ba33a62aea4e 1553 max7219_configuration_t DEVICE1, DEVICE2;
viewdeep51 0:ba33a62aea4e 1554 DEVICE1.device_number = 1;
viewdeep51 0:ba33a62aea4e 1555 DEVICE1.decode_mode = 0xff; //bcd decode mode
viewdeep51 0:ba33a62aea4e 1556 DEVICE1.intensity = 8; //Max7219::MAX7219_INTENSITY_8, //intensity moderate
viewdeep51 0:ba33a62aea4e 1557 DEVICE1.scan_limit = 8; // Max7219::MAX7219_SCAN_8, 8-digit scan driving two displays ds1 nd ds2
viewdeep51 0:ba33a62aea4e 1558
viewdeep51 0:ba33a62aea4e 1559 DEVICE2.device_number = 2;
viewdeep51 0:ba33a62aea4e 1560 DEVICE2.decode_mode = 0xff; //bcd decode mode
viewdeep51 0:ba33a62aea4e 1561 DEVICE2.intensity = 8; //Max7219::MAX7219_INTENSITY_8, //intensity moderate
viewdeep51 0:ba33a62aea4e 1562 DEVICE2.scan_limit = 4; //Max7219::MAX7219_SCAN_4, 4-digit scan driving one display
viewdeep51 0:ba33a62aea4e 1563
viewdeep51 0:ba33a62aea4e 1564 max7219.init_device(DEVICE1); //DEVICE 1 configured as per above settings
viewdeep51 0:ba33a62aea4e 1565 max7219.enable_device(1);
viewdeep51 0:ba33a62aea4e 1566 max7219.init_device(DEVICE2); //DEVICE 2 configured as per above settings
viewdeep51 0:ba33a62aea4e 1567 max7219.enable_device(2);
viewdeep51 0:ba33a62aea4e 1568 max7219.set_display_test();
viewdeep51 0:ba33a62aea4e 1569 wait(1);
viewdeep51 0:ba33a62aea4e 1570 max7219.clear_display_test();
viewdeep51 0:ba33a62aea4e 1571 for(uint8_t i=0; i<=07;i++)
viewdeep51 0:ba33a62aea4e 1572 {
viewdeep51 0:ba33a62aea4e 1573 max7219.write_digit(1, i+1, 0x01); //device 1 cmd display, digit 0-7 ,data 0x01, ----, ---- on both displays
viewdeep51 0:ba33a62aea4e 1574 }
viewdeep51 0:ba33a62aea4e 1575
viewdeep51 0:ba33a62aea4e 1576 for(uint8_t i=0; i<=03;i++)
viewdeep51 0:ba33a62aea4e 1577 {
viewdeep51 0:ba33a62aea4e 1578 max7219.write_digit(1, i+1, 0x01); //device 2 RTC display, digit 0-3 ,data 0x01, ---- on display
viewdeep51 0:ba33a62aea4e 1579 }
viewdeep51 0:ba33a62aea4e 1580 }
viewdeep51 0:ba33a62aea4e 1581 void Discrete_Init()
viewdeep51 0:ba33a62aea4e 1582 {
viewdeep51 0:ba33a62aea4e 1583 buzzer = _ON;
viewdeep51 0:ba33a62aea4e 1584 hooter = _ON; //on
viewdeep51 0:ba33a62aea4e 1585 wait(1); // one second delay
viewdeep51 0:ba33a62aea4e 1586 buzzer = _OFF;
viewdeep51 0:ba33a62aea4e 1587 hooter = _OFF; //off
viewdeep51 0:ba33a62aea4e 1588 }
viewdeep51 0:ba33a62aea4e 1589
viewdeep51 0:ba33a62aea4e 1590 void Led_Init()
viewdeep51 0:ba33a62aea4e 1591 {
viewdeep51 0:ba33a62aea4e 1592 /* setting brightness as 50% duty cycle*/
viewdeep51 0:ba33a62aea4e 1593
viewdeep51 0:ba33a62aea4e 1594 for(uint8_t i=0;i<=1;i++) //direction led initialisation 02 no.s
viewdeep51 0:ba33a62aea4e 1595 {
viewdeep51 0:ba33a62aea4e 1596 LED_DIR[i].set_Brightness(0.50); //setting duty cycle 50%
viewdeep51 0:ba33a62aea4e 1597 }
viewdeep51 0:ba33a62aea4e 1598 for(uint8_t i=0;i<=1;i++) //ctrl led intialisation 02 no.s
viewdeep51 0:ba33a62aea4e 1599 {
viewdeep51 0:ba33a62aea4e 1600 LED_CTRL[i].set_Brightness(0.50);
viewdeep51 0:ba33a62aea4e 1601 }
viewdeep51 0:ba33a62aea4e 1602 for(uint8_t i=0; i<=7;i++) //ach led initialisation 08 no.s
viewdeep51 0:ba33a62aea4e 1603 {
viewdeep51 0:ba33a62aea4e 1604 LED_ACH[i].set_Brightness(0.50);
viewdeep51 0:ba33a62aea4e 1605 }
viewdeep51 0:ba33a62aea4e 1606
viewdeep51 0:ba33a62aea4e 1607 /* turning all leds ON*/
viewdeep51 0:ba33a62aea4e 1608
viewdeep51 0:ba33a62aea4e 1609 for(uint8_t i=0;i<=1;i++)
viewdeep51 0:ba33a62aea4e 1610 {
viewdeep51 0:ba33a62aea4e 1611 LED_DIR[i].ON();
viewdeep51 0:ba33a62aea4e 1612 }
viewdeep51 0:ba33a62aea4e 1613 for(uint8_t i=0;i<=1;i++)
viewdeep51 0:ba33a62aea4e 1614 {
viewdeep51 0:ba33a62aea4e 1615 LED_CTRL[i].ON();
viewdeep51 0:ba33a62aea4e 1616 }
viewdeep51 0:ba33a62aea4e 1617 for(uint8_t i=0; i<=7;i++)
viewdeep51 0:ba33a62aea4e 1618 {
viewdeep51 0:ba33a62aea4e 1619 LED_ACH[i].ON();
viewdeep51 0:ba33a62aea4e 1620 }
viewdeep51 0:ba33a62aea4e 1621
viewdeep51 0:ba33a62aea4e 1622 wait(1); //wait for a 1 sec
viewdeep51 0:ba33a62aea4e 1623
viewdeep51 0:ba33a62aea4e 1624 /* turning all leds OFF*/
viewdeep51 0:ba33a62aea4e 1625
viewdeep51 0:ba33a62aea4e 1626 for(uint8_t i=0;i<=1;i++)
viewdeep51 0:ba33a62aea4e 1627 {
viewdeep51 0:ba33a62aea4e 1628 LED_DIR[i].OFF();
viewdeep51 0:ba33a62aea4e 1629 }
viewdeep51 0:ba33a62aea4e 1630 for(uint8_t i=0;i<=1;i++)
viewdeep51 0:ba33a62aea4e 1631 {
viewdeep51 0:ba33a62aea4e 1632 LED_CTRL[i].OFF();
viewdeep51 0:ba33a62aea4e 1633 }
viewdeep51 0:ba33a62aea4e 1634 for(uint8_t i=0; i<=7;i++)
viewdeep51 0:ba33a62aea4e 1635 {
viewdeep51 0:ba33a62aea4e 1636 LED_ACH[i].OFF();
viewdeep51 0:ba33a62aea4e 1637 }
viewdeep51 0:ba33a62aea4e 1638 }
viewdeep51 0:ba33a62aea4e 1639
viewdeep51 0:ba33a62aea4e 1640 void parameters_init()
viewdeep51 0:ba33a62aea4e 1641 {
viewdeep51 0:ba33a62aea4e 1642 /*intialization of all bool data types indicating different error flags */
viewdeep51 0:ba33a62aea4e 1643 pot_Error = false;
viewdeep51 0:ba33a62aea4e 1644 spi_ERR = false;
viewdeep51 0:ba33a62aea4e 1645 pot_MCR_err = false;
viewdeep51 0:ba33a62aea4e 1646 pot_ER_err = false;
viewdeep51 0:ba33a62aea4e 1647 test = false;
viewdeep51 0:ba33a62aea4e 1648
viewdeep51 0:ba33a62aea4e 1649 /*intialization of all bool data types indicating flag on key press interruption */
viewdeep51 0:ba33a62aea4e 1650 key_NUM = false;
viewdeep51 0:ba33a62aea4e 1651 key_CTRL = false;
viewdeep51 0:ba33a62aea4e 1652 key_DISP = false;
viewdeep51 0:ba33a62aea4e 1653 key_SET = false;
viewdeep51 0:ba33a62aea4e 1654
viewdeep51 0:ba33a62aea4e 1655 RPM_cmd = false; //if true RPM command is raised
viewdeep51 0:ba33a62aea4e 1656 DIR_cmd = false; //if true DIR command is raised
viewdeep51 0:ba33a62aea4e 1657
viewdeep51 0:ba33a62aea4e 1658 /*intialization of all bool data types indicating flags while serial receive */
viewdeep51 0:ba33a62aea4e 1659 CMD_ack_rcvd = false;
viewdeep51 0:ba33a62aea4e 1660 HB_ack_rcvd = false;
viewdeep51 0:ba33a62aea4e 1661 CMD_rcvd = false;
viewdeep51 0:ba33a62aea4e 1662 BROADCAST_rcvd = false;
viewdeep51 0:ba33a62aea4e 1663 HB_rcvd = false;
viewdeep51 0:ba33a62aea4e 1664 REQ_rcvd = false;
viewdeep51 0:ba33a62aea4e 1665 ACK_rcvd = false;
viewdeep51 0:ba33a62aea4e 1666 rcvd_DIR = false;
viewdeep51 0:ba33a62aea4e 1667
viewdeep51 0:ba33a62aea4e 1668 /*intialization of all bool data types indicating flags while serial transmit */
viewdeep51 0:ba33a62aea4e 1669 BROADCAST_send = false;
viewdeep51 0:ba33a62aea4e 1670 CMD_send = false;
viewdeep51 0:ba33a62aea4e 1671 REQ_send = false;
viewdeep51 0:ba33a62aea4e 1672 ACK_send = false;
viewdeep51 0:ba33a62aea4e 1673 HB_send = false;
viewdeep51 0:ba33a62aea4e 1674 CMD_ack_send = false;
viewdeep51 0:ba33a62aea4e 1675
viewdeep51 0:ba33a62aea4e 1676 /*intialization of all bool data types indicating active channel changeover*/
viewdeep51 0:ba33a62aea4e 1677 test=false;
viewdeep51 0:ba33a62aea4e 1678 ACH_SW_over = switch_CH = false;
viewdeep51 0:ba33a62aea4e 1679
viewdeep51 0:ba33a62aea4e 1680 _disp_FLASH = false;
viewdeep51 0:ba33a62aea4e 1681
viewdeep51 0:ba33a62aea4e 1682 /*intialization of all int data types*/
viewdeep51 0:ba33a62aea4e 1683 addr = req = ack = cmd = dir = last_cmd = ach_S = ach_M = brightness = 0;
viewdeep51 0:ba33a62aea4e 1684 pot_Addr = addr_ID = send_ADDR = rcvd_ADDR = req_ADDR = ack_ADDR = 0;
viewdeep51 0:ba33a62aea4e 1685 test_cnt = err_ID = err_Status = 0;
viewdeep51 0:ba33a62aea4e 1686 spi_error = no_pot_connected = checksum =0;
viewdeep51 0:ba33a62aea4e 1687 HB_timer =0;
viewdeep51 0:ba33a62aea4e 1688
viewdeep51 0:ba33a62aea4e 1689 device_addr = -1;
viewdeep51 0:ba33a62aea4e 1690
viewdeep51 0:ba33a62aea4e 1691 digit_disp1 = 5; //bcoz 5-1 = 4th digit is entered first
viewdeep51 0:ba33a62aea4e 1692 digit_disp2 = 0;
viewdeep51 0:ba33a62aea4e 1693 digit_disp3 = 0;
viewdeep51 0:ba33a62aea4e 1694
viewdeep51 0:ba33a62aea4e 1695 POT = new _POT[NO_MAX_POT];
viewdeep51 0:ba33a62aea4e 1696 }
viewdeep51 0:ba33a62aea4e 1697
viewdeep51 0:ba33a62aea4e 1698 void POT_INIT()
viewdeep51 0:ba33a62aea4e 1699 {
viewdeep51 0:ba33a62aea4e 1700 parameters_init();
viewdeep51 0:ba33a62aea4e 1701 Led_Init();
viewdeep51 0:ba33a62aea4e 1702 Discrete_Init();
viewdeep51 0:ba33a62aea4e 1703 //INT_Init();
viewdeep51 0:ba33a62aea4e 1704 Spi2_Init();
viewdeep51 0:ba33a62aea4e 1705 max7219_init();
viewdeep51 0:ba33a62aea4e 1706 Spi3_Init();
viewdeep51 0:ba33a62aea4e 1707 mcp23s17_init();
viewdeep51 0:ba33a62aea4e 1708 Uart_Init();
viewdeep51 0:ba33a62aea4e 1709 read_EOT_ADDR();
viewdeep51 0:ba33a62aea4e 1710 //config_EOT();
viewdeep51 0:ba33a62aea4e 1711 if(addr_ID == pot_Master) //if addres of master eot found, by default master
viewdeep51 0:ba33a62aea4e 1712 {
viewdeep51 0:ba33a62aea4e 1713 int_A.rise(&read_KEY_A); //all key functions enabled for PORTA,B,C
viewdeep51 0:ba33a62aea4e 1714 int_B.rise(&read_KEY_B);
viewdeep51 0:ba33a62aea4e 1715 int_C.rise(&read_KEY_C);
viewdeep51 0:ba33a62aea4e 1716 HB_timer=(float)(1/no_pot_connected);
viewdeep51 0:ba33a62aea4e 1717 // NVIC_SetPriority(UART2_IRQn,0);
viewdeep51 0:ba33a62aea4e 1718 pot_HB.attach(&HB_handler,HB_timer); //HB timer started
viewdeep51 0:ba33a62aea4e 1719 UART.attach( &read_SERIAL, UART.RxIrq); //receive interrupt enabled
viewdeep51 0:ba33a62aea4e 1720 }
viewdeep51 0:ba33a62aea4e 1721 else
viewdeep51 0:ba33a62aea4e 1722 {
viewdeep51 0:ba33a62aea4e 1723 if(pot_Submaster <= addr_ID <= pot_Listner_ASP)
viewdeep51 0:ba33a62aea4e 1724 {
viewdeep51 0:ba33a62aea4e 1725 int_A.rise(NULL); //all key functions/interrupt disabled for PORTA & B
viewdeep51 0:ba33a62aea4e 1726 int_B.rise(NULL);
viewdeep51 0:ba33a62aea4e 1727 int_C.rise(&read_KEY_C); //only PORTC needs to be intialized in other all cases req,inc,dec,tst
viewdeep51 0:ba33a62aea4e 1728 UART.attach( &read_SERIAL, UART.RxIrq); //receive interrupt enabled
viewdeep51 0:ba33a62aea4e 1729 }
viewdeep51 0:ba33a62aea4e 1730 else
viewdeep51 0:ba33a62aea4e 1731 {
viewdeep51 0:ba33a62aea4e 1732 int_A.rise(NULL);
viewdeep51 0:ba33a62aea4e 1733 int_B.rise(NULL);
viewdeep51 0:ba33a62aea4e 1734 int_C.rise(NULL);
viewdeep51 0:ba33a62aea4e 1735 pot_Error = true;
viewdeep51 0:ba33a62aea4e 1736 //return(-1);
viewdeep51 0:ba33a62aea4e 1737 }
viewdeep51 0:ba33a62aea4e 1738 }
viewdeep51 0:ba33a62aea4e 1739 }
viewdeep51 0:ba33a62aea4e 1740
viewdeep51 0:ba33a62aea4e 1741 int main()
viewdeep51 0:ba33a62aea4e 1742 {
viewdeep51 0:ba33a62aea4e 1743 POT_INIT();
viewdeep51 0:ba33a62aea4e 1744 while(1)
viewdeep51 0:ba33a62aea4e 1745 {
viewdeep51 0:ba33a62aea4e 1746 }
viewdeep51 0:ba33a62aea4e 1747 }