TRC Library for FRC (2011) 2011
TRC Library Code Project

C:/Users/Michael/Frc/2011/code/trclib/DigitalIn.h

Go to the documentation of this file.
00001 #if 0
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 #endif
00015 
00016 #ifndef _DIGITALIN_H
00017 #define _DIGITALIN_H
00018 
00019 #ifdef MOD_ID
00020     #undef MOD_ID
00021 #endif
00022 #define MOD_ID                  MOD_DIGITALIN
00023 #ifdef MOD_NAME
00024     #undef MOD_NAME
00025 #endif
00026 #define MOD_NAME                "DigitalIn"
00027 
00028 //
00029 // Macros.
00030 //
00031 #define DInMask(n)              (1 << (16 - (n)))
00032 
00039 class DigitalInNotify
00040 {
00041 public:
00051     virtual
00052     void
00053     NotifyDIn(
00054         __in UINT32 slot,
00055         __in UINT16 maskDIn,
00056         __in bool   fActive
00057         ) = 0;
00058 };  //class DigitalInNotify
00059 
00066 class DigitalIn: public DigitalModule
00067 {
00068 private:
00069     UINT32           m_slot;
00070     DigitalInNotify *m_notify;
00071     UINT16           m_prevDIn;
00072 
00073 public:
00080     DigitalIn(
00081         __in DigitalInNotify *notify = NULL
00082         ): DigitalModule(GetDefaultDigitalModule()),
00083            m_slot(GetDefaultDigitalModule()),
00084            m_notify(notify)
00085     {
00086         TLevel(INIT);
00087         TEnterMsg(("Slot=%d,notify=%p", m_slot, notify));
00088 
00089         m_prevDIn = GetDIO();
00090 
00091         TExit();
00092     }   //DigitalIn
00093 
00101     DigitalIn(
00102         __in UINT32           slot,
00103         __in DigitalInNotify *notify = NULL
00104         ): DigitalModule(slot),
00105            m_slot(slot),
00106            m_notify(notify)
00107     {
00108         TLevel(INIT);
00109         TEnterMsg(("Slot=%d,notify=%p", slot, notify));
00110 
00111         m_prevDIn = GetDIO();
00112 
00113         TExit();
00114     }   //DigitalIn
00115 
00119     ~DigitalIn(
00120         void
00121         )
00122     {
00123         TLevel(INIT);
00124         TEnter();
00125         TExit();
00126     }   //~DigitalIn
00127 
00134     void
00135     DigitalInTask(
00136         void
00137         )
00138     {
00139         TLevel(HIFREQ);
00140         TEnter();
00141 
00142         UINT16 currDIn = GetDIO();
00143         if (m_notify != NULL)
00144         {
00145             UINT16 changedDIn = m_prevDIn^currDIn;
00146             UINT16 maskDIn;
00147             while (changedDIn != 0)
00148             {
00149                 //
00150                 // maskButton contains the least significant set bit.
00151                 //
00152                 maskDIn = changedDIn & ~(changedDIn^-changedDIn);
00153                 if ((currDIn & maskDIn) != 0)
00154                 {
00155                     //
00156                     // DigitalIn is active.
00157                     //
00158                     m_notify->NotifyDIn(m_slot, maskDIn, true);
00159                 }
00160                 else
00161                 {
00162                     //
00163                     // DigitalIn is inactive.
00164                     //
00165                     m_notify->NotifyDIn(m_slot, maskDIn, false);
00166                 }
00167                 //
00168                 // Clear the least significant set bit.
00169                 //
00170                 changedDIn &= ~maskDIn;
00171             }
00172         }
00173         m_prevDIn = currDIn;
00174 
00175         TExit();
00176     }   //DigitalInTask
00177 };  //class DigitalIn
00178 
00179 #endif  //ifndef _DIGITALIN_H
 All Classes Files Functions Variables Defines