unsigned char st_run(void){ if (timerCountDownActivated == POWER_SUPPLY) { if (isPowerLED_ON()== OFF) { timerCountDownActivated = NOT_ACTIVATED; setTracking(OFF); setHeartBeat(OFF); setActivityDetected(FALSE); return POWEROFF; } return RUN; } else if (timerCountDownActivated == SUSPEND_ACK_WAITING) { if (timerExpired()) { //Computer might hangs //Heartbeat = TRUE but never ACK SUSPEND timerCountDownActivated = NOT_ACTIVATED; }else if (getSuspendAcknowledge()) { timerCountDownActivated = NOT_ACTIVATED; setTimerIn100ms(ZERO); setTracking(OFF); setHeartBeat(OFF); setActivityDetected(FALSE); return SUSPEND; } return RUN; } if (getHeartBeatInactiveTimeInS() > HEARTBEAT_THRESOLD_SEC) { //Ubuntu hangs -> Turn it off powerSupplyON(OFF); timerCountDownActivated = POWER_SUPPLY; }else if (getTracking()==OFF) { //Ubuntu not tracking -> Suspend sendSuspendRequest(); timerCountDownActivated = SUSPEND_ACK_WAITING; setTimerIn100ms(SUSPENSION_WAIT); } return RUN; }
unsigned char st_suspend(void){ //State Transition is occuring if (timerCountDownActivated == POWER_BUTTON_OFF) { if (timerExpired()) { powerButtonPressed(RELEASED); timerCountDownActivated = NOT_ACTIVATED; if (getActivityInactiveTimeInS() > POWEROFF_THRESOLD_SEC) { return BEFOREPOWEROFF; } else { setHeartBeat(OFF); return BOOTING; } } else{ return SUSPEND; } } //Activty detected OR NON-Activity for too long if (activityDetected() || getActivityInactiveTimeInS() > POWEROFF_THRESOLD_SEC) { powerButtonPressed(PRESSED); timerCountDownActivated = POWER_BUTTON_OFF; setTimerIn100ms(POWER_BUTTON_PRESSED); } return SUSPEND; }
unsigned char st_powerOff(void){ //State Transition is occuring if (timerCountDownActivated == POWER_BUTTON_ON) { if (timerExpired()) { powerButtonPressed(RELEASED); if (isPowerLED_ON()) { timerCountDownActivated = NOT_ACTIVATED; setTimerIn100ms(ZERO); setHeartBeat(OFF); return BOOTING; } } //May hangs here return POWEROFF; } //Press the button for POWER_BUTTON_PRESSED time and switch state if (activityDetected()) { powerSupplyON(ON); powerButtonPressed(PRESSED); timerCountDownActivated = POWER_BUTTON_ON; setTimerIn100ms(POWER_BUTTON_PRESSED); } return POWEROFF; }
/* init node */ void CanNode::initCanNode(int can_idx, int node_id) { /* get the channels */ CAN_MSG msg; //Digit input channels CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,0); CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,1); sendSDO("40 00 60 00"); _sleep(100); if(CAN_ReadMsg(can_idx, node_id,1,&msg) == CAN_OK) m_Channels[0] = (int)msg.a_data[4] * 4; /*else QMessageBox::warning(0,"digit","read error");*/ //Digit output channels CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,0); CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,1); sendSDO("40 00 62 00"); _sleep(100); if(CAN_ReadMsg(can_idx, node_id,1,&msg) == CAN_OK) m_Channels[1] = (int)msg.a_data[4] * 4; /*else QMessageBox::warning(0,"digit","read error");*/ //IP2302 has 4 digit input channels and 4 digit output channels //sendState(00,80); //_sleep(1000); //if(CAN_ReadMsg(can_idx, node_id,1,&msg) == CAN_OK) //{ // m_Channels[0] = 4; // m_Channels[1] = 4; //} //Analog input channels CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,0); CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,1); sendSDO("40 01 64 00"); _sleep(100); if(CAN_ReadMsg(can_idx, node_id,1,&msg) == CAN_OK) m_Channels[2] = (int)msg.a_data[4]; //Analog output channels CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,0); CAN_ConfigQueue(can_idx,node_id,CAN_RX_QUE,1); sendSDO("40 11 64 00"); _sleep(100); if(CAN_ReadMsg(can_idx, node_id,1,&msg) == CAN_OK) m_Channels[3] = (int)msg.a_data[4]; //QMessageBox::about(0,"channels",QString("channels:%1,%2,%3,%4").arg(m_Channels[0]).arg(m_Channels[1]).arg(m_Channels[2]).arg(m_Channels[3])); sendState(01,00); setHeartBeat(0); setEventDriver(false); }
unsigned char st_booting(void){ if (getHeartBeat()) { //Need to reset the tracking timer setTracking(ON); setHeartBeat(ON); return RUN; } else { return BOOTING; } }