diff --git a/src/battery_monitor.cpp b/src/battery_monitor.cpp index 8b348b15ae0987d62d6afd298b84c420f167959c..04e94178f89cb7b6826a3c0d7e1ce2dceed934a5 100755 --- a/src/battery_monitor.cpp +++ b/src/battery_monitor.cpp @@ -61,6 +61,7 @@ void *CBattery_Monitor::battery_monitor_thread(void *param) CBattery_Monitor *battery=(CBattery_Monitor *)param; short int data[21]; bool end=false; + std::list<TAlarm>::iterator iterator; while(!end) { @@ -70,7 +71,7 @@ void *CBattery_Monitor::battery_monitor_thread(void *param) else { /* get the data from the battery */ - battery->bat_mon->read_registers(0x20,(unsigned char *)data,38); + battery->bat_mon->read_registers(0x20,(unsigned char *)data,42); /* convert the data */ battery->info.temperature=data[0]/10.0-273.15; battery->info.battery_voltage=data[1]/1000.0; @@ -79,20 +80,44 @@ void *CBattery_Monitor::battery_monitor_thread(void *param) battery->info.relative_state_of_charge=data[4]; battery->info.absolute_state_of_charge=data[5]; battery->info.remaining_capacity=data[6]/1000.0; - battery->info.full_charge_capacity=data[7]/1000.0; + battery->info.full_charge_capacity=((unsigned short int)data[7])/1000.0; battery->info.run_time_to_empty=data[8]; battery->info.avg_time_to_empty=data[9]; battery->info.avg_time_to_full=data[10]; battery->info.charging_current=data[11]/1000.0; battery->info.charging_voltage=data[12]/1000.0; (*((unsigned short int *)&battery->info.status))=data[13]; - battery->info.design_capacity=data[14]/1000.0; + battery->info.design_capacity=((unsigned short int)data[14])/1000.0; battery->info.design_voltage=data[15]/1000.0; // pack status ignored battery->info.cell4_voltage=data[17]/1000.0; battery->info.cell3_voltage=data[18]/1000.0; battery->info.cell2_voltage=data[19]/1000.0; battery->info.cell1_voltage=data[20]/1000.0; + + bool active_alarm=false; + for(iterator=battery->alarms.begin();iterator!=battery->alarms.end();iterator++) + { + if(iterator->condition_function(&battery->info)) + { + active_alarm=true; + if(!battery->event_server->event_is_set(iterator->event_id)) + battery->event_server->set_event(iterator->event_id); + // start the thread sound + battery->current_alarm=iterator; + if(battery->sound_enabled) + { + /* start the thread only once */ + if(battery->thread_server->get_thread_state(battery->battery_sound_thread_id)==attached) + battery->thread_server->start_thread(battery->battery_sound_thread_id); + } + break; + } + } + + if(!active_alarm) + battery->disable_alarm_sound(); + } }catch(CException &e){ std::cout << e.what() << std::endl; diff --git a/src/battery_monitor.h b/src/battery_monitor.h index 9e13d15b9af3a8693104c6dc7bef211b3a644f17..5af0ffbd8d53ac26c6b6690dcdc88593a6a10927 100755 --- a/src/battery_monitor.h +++ b/src/battery_monitor.h @@ -9,7 +9,7 @@ typedef struct { - unsigned short int error:3; + unsigned short int error:4; unsigned short int fully_discharged:1; unsigned short int fully_charged:1; unsigned short int discharging:1; diff --git a/src/examples/battery_monitor_test.cpp b/src/examples/battery_monitor_test.cpp index ad97eeaf3e540ac7a4d71f8013e26990f105a3b0..b176c1982a07603f8b5dd732530bdc3c28d3f896 100755 --- a/src/examples/battery_monitor_test.cpp +++ b/src/examples/battery_monitor_test.cpp @@ -6,7 +6,7 @@ #include <linux/kd.h> #include <signal.h> -std::string battery_dev="A900WSG1"; +std::string battery_dev="A600eB1Y"; bool condition1(TBatteryInfo *info) {