/* !!!! This function is designed for the controller !!!!! Purpose: To send the commands to each floor node as needed */ void Floor(unsigned char floor, unsigned char sub_comp, unsigned char instruction) { unsigned char data[DATA_LENGTH]; if(sub_comp == CALL_SWITCH1) { // Send led light so the user knows the car is coming data[0] = floor; data[1] = CALL_LED1; data[2] = ON; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(floor, 0x00, 0x00, DATA_LENGTH, data); switch(floor) { case F1: LCDprintf("\nGo To: 1 \r",0); break; case F2: LCDprintf("\nGo To: 2 \r",0); break; case F3: LCDprintf("\nGo To: 3 \r",0); break; } data[0] = PID; data[1] = SET_POINT; data[2] = floor; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(PID, 0x00, 0x00, DATA_LENGTH, data); } else if(sub_comp == CALL_SWITCH2) { data[0] = floor; data[1] = CALL_LED2; data[2] = ON; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(floor, 0x00, 0x00, DATA_LENGTH, data); switch(floor) { case F1: LCDprintf("\nGo To: 1 \r",0); //dest_floor = F1; break; case F2: LCDprintf("\nGo To: 2 \r",0); break; case F3: LCDprintf("\nGo To: 3 \r",0); break; } data[0] = PID; data[1] = SET_POINT; data[2] = floor; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(PID, 0x00, 0x00, DATA_LENGTH, data); } }
/* !!!! This function is designed for the controller !!!!! Purpose: Send out instructions from the elevator car node Input: Requests from the car node */ void Car(unsigned char sub_comp, unsigned char instruction) { static unsigned char data[DATA_LENGTH]; switch(sub_comp) { // Floor button case FLOOR_BUTTON: // From the elevator car node to the disance sensor /*data[0] = PID; data[1] = SET_POINT; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(PID, 0x00, 0x00, DATA_LENGTH, data);*/ // From the car back to the car data[0] = CAR; data[1] = BUTTON_INDICATOR_ON; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(CAR, 0x00, 0x00, DATA_LENGTH, data); switch(instruction) { case 3: LCDprintf("\nGo To: 1 \r",0); break; case 4: LCDprintf("\nGo To: 2 \r",0); break; case 5: LCDprintf("\nGo To: 3 \r",0); break; } break; case 1: data[0] = CAR; data[1] = 1; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(CAR, 0x00, 0x00, DATA_LENGTH, data); break; // E-Stop case E_STOP: break; } }
void CANGetData(st_cmd_t* Rx){ can_get_status(Rx); CANGIE|=(1<<ENIT); if(can_Status==CAN_Pending){ can_Status=CAN_Send; CANSend(); } }
void CANSendData(void){ if(can_queue_head!=can_queue_tail){ if(can_rx!=0){ CANGIE&=~(1<<ENRX); can_rx->cmd=CMD_ABORT; can_cmd(can_rx); while(can_get_status(can_rx)==CAN_STATUS_NOT_COMPLETED); } if(CANGIE&(1<<ENIT)){ can_Status=CAN_Send; CANSend(); }else{ can_Status=CAN_Pending; } }else if(can_rx!=0){ can_rx->cmd=CMD_RX_DATA; can_cmd(can_rx); CANGIE|=(1<<ENRX); } }
void main(void) { /* put your own code here */ SET_TCNT_PRESCALE( TCNT_PRESCALE_8); TSCR1 = TSCR1_INIT; seg_init(); CANinit(THE_FLOOR); SET_BITS(LED_DDR, LED1_MASK|LED2_MASK); node_id = PORTB & 3; //get hardware specified node id while (!(CANCTL0&0x10)); CANRFLG = 0xC3; CANRIER = 0x01; InitializeQueue(&rec); // Create the Recieve Queue clear_seg(); EnableInterrupts; for(;;) { if(IsQueueEmpty(rec) != 0) { DeQueue(&rec); Parse_Floor(); } // button 1 press if((PTJ & (SWITCH1_MASK |SWITCH2_MASK) )== SWITCH1_MASK) { if(THE_FLOOR == F1 || THE_FLOOR == F2) { if (last != SWITCH1_MASK) { // check if button already pressed data[0] = THE_FLOOR; data[1] = CALL_SWITCH1; data[2] = UP; (void)CANSend(CONTROLLER, 0x00, 0x00, DATA_LENGTH, data); last = SWITCH1_MASK; } } else if(THE_FLOOR == F3) { if (last != SWITCH1_MASK) { // check if button already pressed data[0] = THE_FLOOR; data[1] = CALL_SWITCH1; data[2] = DOWN; (void)CANSend(CONTROLLER, 0x00, 0x00, DATA_LENGTH, data); last = SWITCH1_MASK; } } } //button 2 press else if((PTJ & (SWITCH1_MASK |SWITCH2_MASK) )== SWITCH2_MASK) { if(THE_FLOOR == F2) { if (last != SWITCH2_MASK) { // check if button already pressed data[0] = THE_FLOOR; data[1] = CALL_SWITCH2; data[2] = DOWN; CANSend(CONTROLLER, 0x00, 0x00, DATA_LENGTH, data); last = SWITCH2_MASK; } } } else last = 0; // Updates the LED FORCE_BITS(PTS,0b00001100 , led) ; } /* loop forever */ /* please make sure that you never leave main */ }
/* !!!! This function is designed for the controller !!!!! Purpose: Send out instructions from the PID Input: sub_comp - should always be REC_POINT instruction - should be the floor level */ void Feedback(unsigned char sub_comp, unsigned char instruction) { static unsigned char data[DATA_LENGTH]; if(sub_comp == REC_POINT) // Check to make sure that processing is correct { // Distribute the floor indicator to each node data[0] = CAR; data[1] = FLOOR_INDICATOR; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(CAR, 0x00, 0x00, DATA_LENGTH, data); msDELAY(100); data[0] = F1; data[1] = FLOOR_INDICATOR; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(F1, 0x00, 0x00, DATA_LENGTH, data); msDELAY(100); data[0] = F2; data[1] = FLOOR_INDICATOR; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(F2, 0x00, 0x00, DATA_LENGTH, data); msDELAY(100); data[0] = F3; data[1] = FLOOR_INDICATOR; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(F3, 0x00, 0x00, DATA_LENGTH, data); msDELAY(100); //Shut off the call led data[0] = instruction; data[1] = CALL_LED1; data[2] = OFF; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(instruction, 0x00, 0x00, DATA_LENGTH, data); msDELAY(100); data[0] = instruction; data[1] = CALL_LED2; data[2] = OFF; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(instruction, 0x00, 0x00, DATA_LENGTH, data); msDELAY(100); // Shut off elevator car led data[0] = CAR; data[1] = BUTTON_INDICATOR_OFF; data[2] = instruction; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(CAR, 0x00, 0x00, DATA_LENGTH, data); msDELAY(100); // turn on the car door led /* data[0] = CAR; data[1] = DOOR; data[2] = OPEN; SCIprintf("%d%d%d", data[0], data[1], data[2]); (void)CANSend(CAR, 0x00, 0x00, DATA_LENGTH, data); */ } }