62 lines
1.5 KiB
C
62 lines
1.5 KiB
C
|
// Class for handling interrupts.
|
||
|
// Copyright (c) National Instruments 2008. All Rights Reserved.
|
||
|
|
||
|
#ifndef __tInterruptManager_h__
|
||
|
#define __tInterruptManager_h__
|
||
|
|
||
|
#include "tSystem.h"
|
||
|
|
||
|
namespace ni
|
||
|
{
|
||
|
namespace dsc
|
||
|
{
|
||
|
namespace osdep
|
||
|
{
|
||
|
class CriticalSection;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
namespace nFPGA
|
||
|
{
|
||
|
|
||
|
typedef void (*tInterruptHandler)(uint32_t interruptAssertedMask, void *param);
|
||
|
|
||
|
class tInterruptManager : public tSystem
|
||
|
{
|
||
|
public:
|
||
|
tInterruptManager(uint32_t interruptMask, bool watcher, tRioStatusCode *status);
|
||
|
~tInterruptManager();
|
||
|
void registerHandler(tInterruptHandler handler, void *param, tRioStatusCode *status);
|
||
|
uint32_t watch(int32_t timeoutInMs, bool ignorePrevious, tRioStatusCode *status);
|
||
|
void enable(tRioStatusCode *status);
|
||
|
void disable(tRioStatusCode *status);
|
||
|
bool isEnabled(tRioStatusCode *status);
|
||
|
private:
|
||
|
class tInterruptThread;
|
||
|
friend class tInterruptThread;
|
||
|
void handler();
|
||
|
static int handlerWrapper(tInterruptManager *pInterrupt);
|
||
|
|
||
|
void acknowledge(tRioStatusCode *status);
|
||
|
void reserve(tRioStatusCode *status);
|
||
|
void unreserve(tRioStatusCode *status);
|
||
|
tInterruptHandler _handler;
|
||
|
uint32_t _interruptMask;
|
||
|
tInterruptThread *_thread;
|
||
|
NiFpga_IrqContext _rioContext;
|
||
|
bool _watcher;
|
||
|
bool _enabled;
|
||
|
void *_userParam;
|
||
|
|
||
|
// maintain the interrupts that are already dealt with.
|
||
|
static uint32_t _globalInterruptMask;
|
||
|
static ni::dsc::osdep::CriticalSection *_globalInterruptMaskSemaphore;
|
||
|
};
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif // __tInterruptManager_h__
|
||
|
|