00001 // Copyrigth (c) 2007 University of louisiana lafayette 00002 //Authors: Chandan Uddaraju 00003 00004 00005 #ifndef CAJUN_EMC_DRIVE_FRAME_H 00006 #define CAJUN_EMC_DRIVE_FRAME_H 00007 00008 00009 #include "pcan_frame.H" 00010 #include <iostream> 00011 00012 namespace pcan 00013 { 00014 00015 class drive_frame_t : public pcan_frame_t 00016 { 00017 protected: 00018 static unsigned const DEVICE_MASK = 0x0F; 00019 static unsigned const ACTIVE_MASK = 0x10; 00020 static unsigned const ERROR_MASK = 0x60; 00021 static unsigned const ALIVE_MASK = 0x80; 00022 00023 static unsigned const ENCODER_LO_OFFSET = 1; 00024 static unsigned const ENCODER_HI_OFFSET = 2; 00025 00026 static unsigned const INPUT_LO_OFFSET = 1; 00027 static unsigned const INPUT_HI_OFFSET = 2; 00028 static unsigned const INPUT_MASK = 0x07FF; 00029 00030 static unsigned const DEACTIVATE_REQUESTED_MASK = 0x08; 00031 static unsigned const PARK_BRAKE_REQUESTED_MASK = 0x10; 00032 static unsigned const ACTIVATE_REQUESTED_MASK = 0x20; 00033 static unsigned const EVAL_CONNECTED_MASK = 0x40; 00034 static unsigned const EVAL_ACTIVE_MASK = 0x80; 00035 00036 static unsigned const GENERIC_LO_OFFSET = 5; 00037 static unsigned const GENERIC_HI_OFFSET = 6; 00038 static unsigned const COMMAND_OFFSET = 7; 00039 00040 public: 00041 drive_frame_t (pcan_frame_t const &frame_) : pcan_frame_t (frame_) {} 00042 00043 unsigned device () const { return m_msg->DATA[0] & DEVICE_MASK; } 00044 00045 bool is_steering (unsigned id) const 00046 { 00047 unsigned val = id % 10; 00048 if (val <= 3) 00049 return true; 00050 else 00051 return false; 00052 } 00053 00054 bool is_throttle (unsigned id) const 00055 { 00056 unsigned val = id % 10; 00057 if (val >= 4 && val <= 7) 00058 return true; 00059 else 00060 return false; 00061 } 00062 00063 bool active () const { return (m_msg->DATA[0] & ACTIVE_MASK) != 0; } 00064 bool error () const { return (m_msg->DATA[0] & ERROR_MASK) != 0; } 00065 bool alive () const { return (m_msg->DATA[0] & ALIVE_MASK) != 0; } 00066 00067 unsigned encoder () const 00068 { 00069 return (m_msg->DATA[ENCODER_HI_OFFSET] << 8) | 00070 m_msg->DATA[ENCODER_LO_OFFSET]; 00071 } 00072 unsigned input () const 00073 { 00074 return ((m_msg->DATA[INPUT_HI_OFFSET] << 8) | 00075 m_msg->DATA[INPUT_LO_OFFSET]) & INPUT_MASK; 00076 } 00077 00078 bool deactivate_requested () const 00079 { return (m_msg->DATA[4] & DEACTIVATE_REQUESTED_MASK) != 0; } 00080 bool park_brake_requested () const 00081 { return (m_msg->DATA[4] & PARK_BRAKE_REQUESTED_MASK) != 0; } 00082 bool activate_requested () const 00083 { return (m_msg->DATA[4] & ACTIVATE_REQUESTED_MASK) != 0; } 00084 bool eval_connected () const 00085 { return (m_msg->DATA[4] & EVAL_CONNECTED_MASK) != 0; } 00086 bool eval_active () const 00087 { return (m_msg->DATA[4] & EVAL_ACTIVE_MASK) != 0; } 00088 00089 unsigned generic () const 00090 { 00091 return (m_msg->DATA[GENERIC_HI_OFFSET] << 8) | 00092 m_msg->DATA[GENERIC_LO_OFFSET]; 00093 } 00094 00095 unsigned command () const { return m_msg->DATA[COMMAND_OFFSET]; } 00096 }; 00097 00098 00099 }; 00100 00101 00102 #endif