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