diff --git a/src/examples/segway_battery_test.cpp b/src/examples/segway_battery_test.cpp index 543eae773016ecdc0cbd9b7b048e3dd225e96777..0bd1bdad7397f5745b75354e0553a6b2f0847410 100755 --- a/src/examples/segway_battery_test.cpp +++ b/src/examples/segway_battery_test.cpp @@ -4,11 +4,24 @@ std::string battery_dev="A600eByq"; +bool condition1(TBatteryInfo *info) +{ + if(info->rem_capacity<28600) + return true; + else + return false; +} + int main(int argc, char *argv[]) { + CEventServer *event_server=CEventServer::instance(); + std::string cond1_event_id,cond1_name; CSegway_Battery battery(battery_dev); + bool end=false; - while(1) + cond1_name="condition1"; + cond1_event_id=battery.create_alarm(cond1_name,condition1); + while(!end) { try{ std::cout << "Battery voltage: " << battery.get_current_voltage() << " V" << std::endl; @@ -18,7 +31,10 @@ int main(int argc, char *argv[]) std::cout << "Remaining capacity: " << battery.get_remaining_capacity() << " mAh" << std::endl; std::cout << "Time to fully charged: " << battery.get_time_to_charged() << " min" << std::endl; std::cout << "Time to fully discharged: " << battery.get_time_to_discharged() << " min" << std::endl; - sleep(1); + if(event_server->event_is_set(cond1_event_id)) + end=true; + else + sleep(1); }catch(CException &e){ std::cout << e.what() << std::endl; } diff --git a/src/segway_battery.cpp b/src/segway_battery.cpp index f88eb05e027ea1fe55b7fc3dcb162ecc3c0acadf..e023411b4081d93cae927f8c22a379869a31b533 100755 --- a/src/segway_battery.cpp +++ b/src/segway_battery.cpp @@ -96,6 +96,7 @@ void *CSegway_Battery::battery_monitor_thread(void *param) void CSegway_Battery::parse_packet(unsigned char *data, int len) { int i=0; + unsigned int j=0; static int pos=-2; float vt=0.0,res=0.0,k=0.0; static unsigned char packet_data[31]; @@ -154,6 +155,15 @@ void CSegway_Battery::parse_packet(unsigned char *data, int len) this->info.time_to_charged=packet_data[27]+packet_data[28]*256; // convert time to discharged this->info.time_to_discharged=packet_data[29]+packet_data[30]*256; + // check all alarms + for(j=0;j<this->alarms.size();j++) + { + if(this->alarms[j].condition_function(&this->info)) + { + if(!this->event_server->event_is_set(this->alarms[j].event_id)) + this->event_server->set_event(this->alarms[j].event_id); + } + } } } } @@ -233,9 +243,57 @@ bool CSegway_Battery::over_voltage_protection(void) else return false; } + +// alarm handling +std::string CSegway_Battery::create_alarm(std::string &name,bool (*function)(TBatteryInfo *info)) +{ + TAlarm new_alarm; + unsigned int i=0; + + for(i=0;i<this->alarms.size();i++) + { + if(this->alarms[i].id==name) + { + // handle exceptions + throw CException(_HERE_,"An other alarm with the same name already exists."); + } + } + if(function==NULL) + { + // handle exceptions + throw CException(_HERE_,"Invalid condition function."); + } + // initialize the new alarm + new_alarm.id=name; + new_alarm.event_id=name+"_event_id"; + this->event_server->create_event(new_alarm.event_id); + new_alarm.condition_function=function; + this->alarms.push_back(new_alarm); + + return new_alarm.event_id; +} + +void CSegway_Battery::delete_alarm(std::string &name) +{ + unsigned int i=0; + + for(i=0;i<this->alarms.size();i++) + { + if(this->alarms[i].id==name) + { + this->event_server->delete_event(this->alarms[i].event_id); + this->alarms.erase(this->alarms.begin()+i); + return; + } + } + // handle exceptions + throw CException(_HERE_,"No alarm exists with the given name."); +} CSegway_Battery::~CSegway_Battery() { + unsigned int i=0; + if(this->finish_thread_event_id!="") { // signal the thread to terminate @@ -251,6 +309,15 @@ CSegway_Battery::~CSegway_Battery() this->event_server->delete_event(this->finish_thread_event_id); this->finish_thread_event_id=""; } + // clear all alarms + for(i=0;i<this->alarms.size();i++) + { + this->event_server->delete_event(this->alarms[i].event_id); + this->alarms[i].event_id=""; + this->alarms[i].id=""; + this->alarms[i].condition_function=NULL; + } + this->alarms.clear(); // close the serial port if(this->serial!=NULL) { diff --git a/src/segway_battery.h b/src/segway_battery.h index c82e0bcf8db5a354219f2eebc2e3cd0122657ec7..37221176f252d75bfa81ecd826a1579c5c905974 100755 --- a/src/segway_battery.h +++ b/src/segway_battery.h @@ -25,6 +25,12 @@ typedef struct double time_to_discharged; }TBatteryInfo; +typedef struct{ + std::string id; + std::string event_id; + bool (*condition_function)(TBatteryInfo *info); +}TAlarm; + class CSegway_Battery { private: @@ -39,11 +45,14 @@ class CSegway_Battery // battery information TBatteryInfo info; CMutex info_access; + // alarms + std::vector<TAlarm> alarms; protected: static void *battery_monitor_thread(void *param); void parse_packet(unsigned char *data, int len); public: CSegway_Battery(std::string &serial_dev); + // basic battery info double get_current_voltage(void); double get_current_temperature(void); double get_input_current(void); @@ -56,6 +65,9 @@ class CSegway_Battery bool is_load_enabled(void); bool under_voltage_protection(void); bool over_voltage_protection(void); + // alarm handling + std::string create_alarm(std::string &name,bool (*function)(TBatteryInfo *info)); + void delete_alarm(std::string &name); ~CSegway_Battery(); };