00001 #ifndef _hwpinchangeh_
00002 #define _hwpinchangeh_
00003 #include "avrdevice.h"
00004 #include "pin.h"
00005 #include "pinnotify.h"
00006 #include "net.h"
00007 #include "rwmem.h"
00008 #include "hardware.h"
00009
00010 class HWPcifrApi {
00011 public:
00012 virtual ~HWPcifrApi(){}
00013 virtual bool getPcifr(unsigned bit) throw()=0;
00014 virtual void setPcifr(unsigned bit) throw()=0;
00015
00016 };
00017
00018 class HWPcicrApi {
00019 public:
00020 virtual ~HWPcicrApi(){}
00021 virtual bool getPcicr(unsigned bit) throw()=0;
00022 virtual void setPcicr(unsigned bit) throw()=0;
00023
00024 };
00025
00026 class HWPcmskApi {
00027 public:
00028 virtual ~HWPcmskApi(){}
00029 virtual void setPcmskMask(unsigned char val) throw()=0;
00030 virtual unsigned char getPcmskMask() const throw()=0;
00031
00032
00033
00034
00035 };
00036
00037 class HWPcmskPinApi {
00038 public:
00039 virtual ~HWPcmskPinApi(){}
00040 virtual void pinChanged(unsigned bit) throw()=0;
00041 };
00042
00043 class HWPcirMaskApi {
00044 public:
00045 virtual void setPcifrMask(unsigned char val) throw()=0;
00046 virtual unsigned char getPcifrMask() const throw()=0;
00047
00048 virtual void setPcicrMask(unsigned char val) throw()=0;
00049 virtual unsigned char getPcicrMask() const throw()=0;
00050 };
00051
00053 class HWPcir : public HWPcifrApi , public HWPcirMaskApi , public Hardware {
00054 private:
00055 unsigned char _pcifr;
00056 unsigned char _pcicr;
00057 HWIrqSystem& _irqSystem;
00058
00059 const unsigned _vector0;
00060 const unsigned _vector1;
00061 const unsigned _vector2;
00062 const unsigned _vector3;
00063 const unsigned _vector4;
00064 const unsigned _vector5;
00065 const unsigned _vector6;
00066 const unsigned _vector7;
00067
00068 public:
00069
00070
00071 HWPcir( AvrDevice* avr,
00072 HWIrqSystem& irqSystem,
00073 unsigned vector0 = ~0,
00074 unsigned vector1 = ~0,
00075 unsigned vector2 = ~0,
00076 unsigned vector3 = ~0,
00077 unsigned vector4 = ~0,
00078 unsigned vector5 = ~0,
00079 unsigned vector6 = ~0,
00080 unsigned vector7 = ~0
00081 ) throw();
00082
00083 private:
00084 unsigned convertBitToVector(unsigned bit) const throw();
00085
00086 public:
00087 bool getPcifr(unsigned pcifrBit) throw();
00088 void setPcifr(unsigned pcifrBit) throw();
00089
00090 public:
00091 void setPcifrMask(unsigned char val) throw();
00092 unsigned char getPcifrMask() throw();
00093
00094 void setPcicrMask(unsigned char val) throw();
00095 unsigned char getPcicrMask() throw();
00096
00097
00098 IOReg<HWPcir>
00099 pcicr_reg,
00100 pcifr_reg;
00101
00102 private:
00103 void Reset();
00104 void ClearIrqFlag(unsigned int vector);
00105
00106
00107 };
00108
00110 class HWPcmsk : public HWPcmskApi , public HWPcmskPinApi {
00111 private:
00112 HWPcifrApi& _pcifrApi;
00113 unsigned char _pcmsk;
00114 const unsigned _pcifrBit;
00115
00116 public:
00117
00118 HWPcmsk(
00119 AvrDevice *core,
00120 HWPcifrApi& pcifrApi,
00121 unsigned pcifrBit
00122 ) throw();
00123
00124 public:
00125 void setPcmskMask(unsigned char val) throw();
00126 unsigned char getPcmskMask() throw();
00127
00128 public:
00129 void pinChanged(unsigned bit) throw();
00130
00131 IOReg<HWPcmsk> pcmsk_reg;
00132 };
00133
00134
00135
00137 class PinChange : public HasPinNotifyFunction {
00138 private:
00139 Pin& _pin;
00140 HWPcmskPinApi& _pcmskPinApi;
00141 const unsigned _pcmskBit;
00142
00143
00144
00145 bool _prevState;
00146
00147 public:
00148 PinChange( Pin& pin,
00149 HWPcmskPinApi& pcmskPinApi,
00150 unsigned pcmskBit
00151 ) throw();
00152
00153
00154 private:
00155 void PinStateHasChanged(Pin*);
00156 };
00157
00158 #endif