text: /*
  This file is part of CanFestival, a library implementing CanOpen Stack. 
  
  Copyright (C): Edouard TISSERANT and Francis DUPIN
  
  See COPYING file for copyrights details.
  
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
  License as published by the Free Software Foundation; either
  version 2.1 of the License, or (at your option) any later version.
  
  This library is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  Lesser General Public License for more details.
  
  You should have received a copy of the GNU Lesser General Public
  License along with this library; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
  
  /** @defgroup statemachine State Machine
   *  @ingroup userapi
   */
   
  #ifndef __states_h__
  #define __states_h__
  
  #include <applicfg.h>
  
  /* The nodes states 
   * -----------------
   * values are choosen so, that they can be sent directly
   * for heartbeat messages...
   * Must be coded on 7 bits only
   * */
  /* Should not be modified */
  enum enum_nodeState {
    Initialisation  = 0x00, 
    Disconnected    = 0x01,
    Connecting      = 0x02,
    Preparing       = 0x02,
    Stopped         = 0x04,
    Operational     = 0x05,
    Pre_operational = 0x7F,
    Unknown_state   = 0x0F
  };
  
  typedef enum enum_nodeState e_nodeState;
  
  typedef struct
  {
  	INTEGER8 csBoot_Up;
  	INTEGER8 csSDO;
  	INTEGER8 csEmergency;
  	INTEGER8 csSYNC;
  	INTEGER8 csHeartbeat;
  	INTEGER8 csPDO;
  	INTEGER8 csLSS;
  } s_state_communication;
  
  /** 
   * @brief Function that user app can overload
   * @ingroup statemachine
   */
  typedef void (*initialisation_t)(CO_Data*);
  typedef void (*preOperational_t)(CO_Data*);
  typedef void (*operational_t)(CO_Data*);
  typedef void (*stopped_t)(CO_Data*);
  
  /** 
   * @ingroup statemachine
   * @brief Function that user app can overload
   * @param *d Pointer on a CAN object data structure
   */
  void _initialisation(CO_Data* d);
  
  /** 
   * @ingroup statemachine
   * @brief Function that user app can overload
   * @param *d Pointer on a CAN object data structure
   */
  void _preOperational(CO_Data* d);
  
  /**
   * @ingroup statemachine 
   * @brief Function that user app can overload
   * @param *d Pointer on a CAN object data structure
   */
  void _operational(CO_Data* d);
  
  /** 
   * @ingroup statemachine
   * @brief Function that user app can overload
   * @param *d Pointer on a CAN object data structure
   */
  void _stopped(CO_Data* d);
  
  #include "data.h"
  
  /************************* prototypes ******************************/
  
  /** 
   * @brief Called by driver/app when receiving messages
   * @param *d Pointer on a CAN object data structure
   * @param *m Pointer on a CAN message structure
   */
  void canDispatch(CO_Data* d, Message *m);
  
  /** 
   * @ingroup statemachine
   * @brief Returns the state of the node
   * @param *d Pointer on a CAN object data structure
   * @return The node state
   */
  e_nodeState getState (CO_Data* d);
  
  /** 
   * @ingroup statemachine
   * @brief Change the state of the node 
   * @param *d Pointer on a CAN object data structure
   * @param newState The state to assign
   * @return 
   */
  UNS8 setState (CO_Data* d, e_nodeState newState);
  
  /**
   * @ingroup statemachine 
   * @brief Returns the nodId 
   * @param *d Pointer on a CAN object data structure
   * @return
   */
  UNS8 getNodeId (CO_Data* d);
  
  /** 
   * @ingroup statemachine
   * @brief Define the node ID. Initialize the object dictionary
   * @param *d Pointer on a CAN object data structure
   * @param nodeId The node ID to assign
   */
  void setNodeId (CO_Data* d, UNS8 nodeId);
  
  /** 
   * @brief Some stuff to do when the node enter in pre-operational mode
   * @param *d Pointer on a CAN object data structure
   */
  void initPreOperationalMode (CO_Data* d);
  
  #endif
  