00001 #include "evarobot_eio/evarobot_eio.h"
00002
00003 int i_error_code = 0;
00004
00005
00006 void ProduceDiagnostics(diagnostic_updater::DiagnosticStatusWrapper &stat)
00007 {
00008 if(i_error_code<0)
00009 {
00010 stat.summaryf(diagnostic_msgs::DiagnosticStatus::ERROR, "%s", GetErrorDescription(i_error_code).c_str());
00011 i_error_code = 0;
00012 }
00013 else
00014 {
00015 stat.summary(diagnostic_msgs::DiagnosticStatus::OK, "EvarobotEIO: No problem.");
00016 }
00017 }
00018
00019
00020 int main(int argc, char **argv)
00021 {
00022
00023 key_t key;
00024 sem_t *mutex;
00025 FILE * fd;
00026
00027 key = 1005;
00028
00029 mutex = sem_open(SEM_NAME,O_CREAT,0644,1);
00030 if(mutex == SEM_FAILED)
00031 {
00032 ROS_INFO(GetErrorDescription(-98).c_str());
00033 i_error_code = -98;
00034 sem_unlink(SEM_NAME);
00035
00036 return(-1);
00037 }
00038
00039
00040
00041 double d_frequency;
00042
00043 string str_i2c_path;
00044
00045
00046
00047
00048
00049
00050 ros::init(argc, argv, "evarobot_eio");
00051 ros::NodeHandle n;
00052
00053 n.param<string>("evarobot_eio/i2c_path", str_i2c_path, "/dev/i2c-1");
00054
00055 if(!n.getParam("evarobot_eio/frequency", d_frequency))
00056 {
00057 ROS_INFO(GetErrorDescription(-99).c_str());
00058 i_error_code = -99;
00059 }
00060
00061
00062
00063
00064 ros::Rate loop_rate(d_frequency);
00065
00066 IMEIO * eio ;
00067 try{
00068 eio = new IMEIO(0b00100000, string("/dev/i2c-1"), mutex);
00069
00070 eio->SetPinBDirection(IMEIO::EIO0, IMEIO::OUTPUT);
00071 eio->SetPinBDirection(IMEIO::EIO1, IMEIO::OUTPUT);
00072 eio->SetPinBDirection(IMEIO::EIO2, IMEIO::OUTPUT);
00073 eio->SetPinBDirection(IMEIO::EIO3, IMEIO::OUTPUT);
00074 eio->SetPinBDirection(IMEIO::EIO4, IMEIO::OUTPUT);
00075 eio->SetPinBDirection(IMEIO::EIO5, IMEIO::OUTPUT);
00076 eio->SetPinBDirection(IMEIO::EIO6, IMEIO::OUTPUT);
00077 eio->SetPinBDirection(IMEIO::SWR_RESET, IMEIO::OUTPUT);
00078
00079 eio->SetPinADirection(IMEIO::RGB_LED1, IMEIO::OUTPUT);
00080 eio->SetPinADirection(IMEIO::RGB_LED2, IMEIO::OUTPUT);
00081 eio->SetPinADirection(IMEIO::RGB_LED3, IMEIO::OUTPUT);
00082 eio->SetPinADirection(IMEIO::BUZZER, IMEIO::OUTPUT);
00083 eio->SetPinADirection(IMEIO::USER_LED, IMEIO::OUTPUT);
00084 }catch(int e){
00085 ROS_INFO(GetErrorDescription(e).c_str());
00086 i_error_code = e;
00087 }
00088
00089 bool b_data = false;
00090
00091
00092
00093 double d_min_freq = 0.2;
00094 double d_max_freq = 10.0;
00095
00096
00097 diagnostic_updater::Updater updater;
00098 updater.setHardwareID("EvarobotEIO");
00099 updater.add("eio", &ProduceDiagnostics);
00100
00101 diagnostic_updater::HeaderlessTopicDiagnostic pub_freq("eio", updater,
00102 diagnostic_updater::FrequencyStatusParam(&d_min_freq, &d_max_freq, 0.1, 10));
00103
00104 while(ros::ok())
00105 {
00106
00107
00108
00109 b_data = !b_data;
00110 ROS_DEBUG("EvarobotEIO: value: %x \n", b_data);
00111 try{
00112 eio->SetPinBValue(IMEIO::EIO0, b_data);
00113 eio->SetPinBValue(IMEIO::EIO1, b_data);
00114 eio->SetPinBValue(IMEIO::EIO2, b_data);
00115 eio->SetPinBValue(IMEIO::EIO3, b_data);
00116 eio->SetPinBValue(IMEIO::EIO4, b_data);
00117 eio->SetPinBValue(IMEIO::EIO5, b_data);
00118 eio->SetPinBValue(IMEIO::EIO6, b_data);
00119 eio->SetPinBValue(IMEIO::SWR_RESET, b_data);
00120
00121
00122 eio->SetPinAValue(IMEIO::RGB_LED2, b_data);
00123
00124 eio->SetPinAValue(IMEIO::USER_LED, b_data);
00125 eio->SetPinAValue(IMEIO::BUZZER, b_data);
00126 }catch(int e){
00127 ROS_INFO(GetErrorDescription(e).c_str());
00128 i_error_code = e;
00129 }
00130
00131 updater.update();
00132 loop_rate.sleep();
00133
00134 }
00135
00136
00137 return 0;
00138 }