コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
ファイル: CanNode.cpp プロジェクト: tenddy/Scada
 /* 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);
}
コード例 #5
0
unsigned char st_booting(void){

    if (getHeartBeat()) {
		//Need to reset the tracking timer 
		setTracking(ON);
        setHeartBeat(ON);
		return RUN;
    }
    else
    {
        return BOOTING;
    }
}