00001 #ifndef _LCD_SENSOR_H_
00002 #define _LCD_SENSOR_H_
00003
00021 #include "../api/LCDWidget.h"
00022 #include <map>
00023 #include <vector>
00024 #include <pthread.h>
00025
00026 class LCDWidgetTimeOut
00027 {
00028 public:
00029 std::string _widgetId;
00030 int _timeOut;
00031 LCDWidget *_widget;
00032 ::pthread_t _thread;
00033 LCDWidgetTimeOut()
00034 {
00035 _thread = (::pthread_t)-1;
00036 }
00037 bool isValid()
00038 {
00039 return (_thread != (::pthread_t)-1);
00040 }
00041 };
00042
00043 extern "C" void *updateWhenChanged(void *);
00044 extern "C" void *updateEach(void *);
00045
00055 class LCDSensor
00056 {
00057 private:
00058 bool _exist;
00059 bool _onChangeThreadStarted;
00060
00061 typedef void*(*ThreadFunction)(void*);
00062
00063 typedef std::map<std::string, LCDWidget *> WidgetList;
00064 typedef std::map<std::string, LCDWidgetTimeOut> WidgetTimeOutList;
00065
00066 ::pthread_t _onChangeThread;
00067 WidgetList _onChangeList;
00068 WidgetTimeOutList _onTimeOutList;
00069
00070 public:
00071 static const int MAX_CMD_RESULT_LINE_SIZE;
00072 LCDSensor();
00073 ~LCDSensor();
00074 bool exists();
00075 const LCDWidgetTimeOut &getThreadWidgetInfo(const ::pthread_t &thread);
00082 virtual void waitForChange() = 0;
00091 virtual std::string getCurrentValue() = 0;
00100 std::string intToString(int value);
00101
00110 std::string executeCommand(const std::string &cmd);
00111 void fireChanged();
00119 void addOnChangeWidget(LCDWidget *widget);
00128 void addOnTimeOutWidget(LCDWidget *widget, int timeOut);
00135 void removeOnChangeWidget(LCDWidget *widget);
00142 void removeOnChangeWidget(std::string id);
00149 void removeOnTimeOutWidget(LCDWidget *widget);
00156 void removeOnTimeOutWidget(std::string id);
00157 };
00158
00159 #endif