00001
00002 #ifndef INCLUDED_BatteryCheckControl_h_
00003 #define INCLUDED_BatteryCheckControl_h_
00004
00005 #include "ControlBase.h"
00006 #include "Shared/WorldState.h"
00007 #include "Motion/MMAccessor.h"
00008 #include "Motion/LedMC.h"
00009 #include "NullControl.h"
00010 #include "Events/EventRouter.h"
00011 #include "Wireless/Wireless.h"
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 class BatteryCheckControl : public ControlBase, public EventListener {
00027 public:
00028
00029
00030 BatteryCheckControl() : ControlBase("Battery Check","Reports % power remaining, and gives details on console") {}
00031
00032
00033 virtual ~BatteryCheckControl() {}
00034
00035
00036
00037 virtual ControlBase * activate(MotionManager::MC_ID display, Socket * gui) {
00038 sout->printf("Press the \"back\" button to leave battery display\n");
00039 erouter->addListener(this,EventBase::powerEGID);
00040 return ControlBase::activate(display,gui);
00041 }
00042
00043 virtual void pause() {
00044 erouter->forgetListener(this);
00045 display_id=MotionManager::invalid_MC_ID;
00046 }
00047
00048 virtual void refresh() {
00049 report();
00050 if(gui_comm!=NULL && wireless->isConnected(gui_comm->sock)) {
00051 char tmp[20];
00052 sprintf(tmp,"%d",(unsigned int)(state->sensors[PowerRemainOffset]*100));
00053
00054 std::string s("refresh\n");
00055 s+=getName()+"\n1\n0\n0\nPower remain: ";
00056 s+=tmp;
00057 s+="%\nSee console output for details\n";
00058 s+="status\nPower remaining: ";
00059 s+=tmp;
00060 s+="%\n";
00061 gui_comm->write((const byte*)s.c_str(),s.size());
00062 }
00063 }
00064
00065 virtual void deactivate() {
00066 erouter->forgetListener(this);
00067 display_id=MotionManager::invalid_MC_ID;
00068 }
00069
00070 virtual void processEvent(const EventBase& event) {
00071 if(event.getSourceID()!=PowerSourceID::VibrationSID)
00072 refresh();
00073 }
00074 virtual ControlBase * doSelect() {
00075 return this;
00076 }
00077
00078 void report() {
00079 sout->printf("BATTERY REPORT:\n");
00080 sout->printf("\tPower Remain:\t%d%%\n",(int)(state->sensors[PowerRemainOffset]*100));
00081 sout->printf("\tCapacity:\t%d\n",state->sensors[PowerCapacityOffset]);
00082 sout->printf("\tVoltage:\t%g\n",state->sensors[PowerVoltageOffset]);
00083 sout->printf("\tCurrent:\t%d\n",state->sensors[PowerCurrentOffset]);
00084 sout->printf("\tTemperature:\t%g\n",state->sensors[PowerThermoOffset]);
00085 sout->printf("\tFlags:\t");
00086 if(state->powerFlags[PowerSourceID::BatteryConnectSID])
00087 sout->printf("BatteryConnect ");
00088 if(state->powerFlags[PowerSourceID::DischargingSID])
00089 sout->printf("Discharging ");
00090 if(state->powerFlags[PowerSourceID::ChargingSID])
00091 sout->printf("Charging ");
00092 if(state->powerFlags[PowerSourceID::ExternalPowerSID])
00093 sout->printf("ExternalPower ");
00094 if(state->powerFlags[PowerSourceID::PowerGoodSID])
00095 sout->printf("PowerGood ");
00096 if(state->powerFlags[PowerSourceID::LowPowerWarnSID])
00097 sout->printf("LowPowerWarn ");
00098 if(state->powerFlags[PowerSourceID::BatteryEmptySID])
00099 sout->printf("BatteryEmpty ");
00100 sout->printf("\n");
00101 if(display_id!=MotionManager::invalid_MC_ID) {
00102 MMAccessor<LedMC> disp(display_id);
00103 disp->displayPercent(state->sensors[PowerRemainOffset],LedEngine::major,LedEngine::major);
00104 }
00105 }
00106
00107 };
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 #endif