direction commands updated to Up down RPM value

Dependencies:   MAX7219pot MCP23S17 mbed

Fork of POT_V_1_0 by Marine Electricals

Committer:
viewdeep51
Date:
Thu Sep 28 05:10:42 2017 +0000
Revision:
0:ba33a62aea4e
Child:
1:e116808d8b00
28/09/2017

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