API
MagAOX::app::dev::shmimMonitor< derivedT, specificT > Class Template Reference

#include <shmimMonitor.hpp>

Collaboration diagram for MagAOX::app::dev::shmimMonitor< derivedT, specificT >:
Collaboration graph

Public Member Functions

const std::string & shmimName () const
 
const uint32_t & width () const
 
const uint32_t & height () const
 
const uint32_t & depth () const
 
const uint8_t & dataType () const
 
const size_t & typeSize () const
 
int setupConfig (mx::app::appConfigurator &config)
 Setup the configuration system. More...
 
int loadConfig (mx::app::appConfigurator &config)
 load the configuration system results More...
 
int appStartup ()
 Startup function. More...
 
int appLogic ()
 Checks the shmimMonitor thread. More...
 
int appShutdown ()
 Shuts down the shmimMonitor thread. More...
 

Protected Attributes

bool m_getExistingFirst {false}
 If set to true by derivedT, any existing image will be grabbed and sent to processImage before waiting on the semaphore. More...
 
int m_semaphoreNumber {5}
 The image structure semaphore index. More...
 
uint32_t m_width {0}
 The width of the images in the stream. More...
 
uint32_t m_height {0}
 The height of the images in the stream. More...
 
uint32_t m_depth {0}
 The depth of the circular buffer in the stream. More...
 
uint8_t m_dataType {0}
 The ImageStreamIO type code. More...
 
size_t m_typeSize {0}
 The size of the type, in bytes. Result of sizeof. More...
 
IMAGE m_imageStream
 The ImageStreamIO shared memory buffer. More...
 
ino_t m_inode {0}
 The inode of the image stream file. More...
 
Configurable Parameters
std::string m_shmimName {""}
 The name of the shared memory image, is used in /tmp/<shmimName>.im.shm. Derived classes should set a default. More...
 
int m_smThreadPrio {2}
 Priority of the shmimMonitor thread, should normally be > 00. More...
 
std::string m_smCpuset
 The cpuset to assign the shmimMonitor thread to. Ignored if empty (the default). More...
 

Private Member Functions

derivedT & derived ()
 

SIGSEGV & SIGBUS signal handling

These signals occur as a result of a ImageStreamIO source server resetting (e.g. changing frame sizes). When they occur a restart of the shmim monitor thread main loops is triggered.

bool m_restart {false}
 Flag indicating tha the shared memory should be reinitialized. More...
 
static shmimMonitorm_selfMonitor = nullptr
 Static pointer to this (set in constructor). Used for getting out of the static SIGSEGV handler. More...
 

shmimmonitor Thread

This thread actually monitors the shared memory buffer

bool m_smThreadInit {true}
 Synchronizer for thread startup, to allow priority setting to finish. More...
 
pid_t m_smThreadID {0}
 The s.m. thread PID. More...
 
pcf::IndiProperty m_smThreadProp
 The property to hold the s.m. thread details. More...
 
std::thread m_smThread
 A separate thread for the actual monitoring. More...
 
static void smThreadStart (shmimMonitor *s)
 Thread starter, called by MagAOXApp::threadStart on thread construction. Calls smThreadExec. More...
 
void smThreadExec ()
 Execute the monitoring thread. More...
 

INDI

pcf::IndiProperty m_indiP_shmimName
 Property used to report the shmim buffer name. More...
 
pcf::IndiProperty m_indiP_frameSize
 Property used to report the current frame size. More...
 
int updateINDI ()
 Update the INDI properties for this device controller. More...
 

Detailed Description

template<class derivedT, class specificT = shmimT>
class MagAOX::app::dev::shmimMonitor< derivedT, specificT >

MagAO-X generic shared memory monitor

The derived class derivedT has the following requirements (see below for discussion of specificT):

  • Must be derived from MagAOXApp<true>
  • Must contain the following friend declaration:
    friend class dev::shmimMonitor<derivedT, specificT>; //specificT may not need to be included
  • Must provide the following interfaces:
    //The allocate function is called after connecting to the shared memory buffer
    //It should check that the buffer has the expected size, and perform any internal allocations
    //to prepare for processing.
    int derivedT::allocate( const specificT & ///< [in] tag to differentiate shmimMonitor parents. Normally this is dev::shmimT for a single parent.
    );
    int derivedT::processImage( void * curr_src, ///< [in] pointer to the start of the current frame
    const specificT & ///< [in] tag to differentiate shmimMonitor parents. Normally this is dev::shmimT for a single parent.
    )
    Each of the above functions should return 0 on success, and -1 on an error.
  • Calls to this class's setupConfig, loadConfig, appStartup, appLogic, updateINDI and appShutdown functions must be placed in the derived class's functions of the same name. For convenience the following macros are defined to provide error checking:
    #define SHMIMMONITOR_APP_SHUTDOWN
    Call shmimMonitorT::appShutdown with error checking for shmimMonitor.
    #define SHMIMMONITOR_APP_LOGIC
    Call shmimMonitorT::appLogic with error checking for shmimMonitor.
    #define SHMIMMONITOR_APP_STARTUP
    Call shmimMonitorT::appStartup with error checking for shmimMonitor.
    #define SHMIMMONITOR_LOAD_CONFIG(cfig)
    Call shmimMonitorT::loadConfig with error checking for shmimMonitor.
    #define SHMIMMONITOR_UPDATE_INDI
    Call shmimMonitorT::updateINDI with error checking for shmimMonitor.
    #define SHMIMMONITOR_SETUP_CONFIG(cfig)
    Call shmimMonitorT::setupConfig with error checking for shmimMonitor.

    See below for the macros to use if specificT is used to specialize.

The template specifier specificT allows inheritance of multiple shmimMonitor classes. This type must have at least the static member function:

static std::string indiPrefix()

which returns the string which is prefixed to INDI properties. The default shmimT uses "sm".

Additionally, if specificT is used, the following convenience macros can be used:

SHMIMMONITORT_SETUP_CONFIG( SHMIMMONITORT, cfig )
SHMIMMONITORT_LOAD_CONFIG( SHMIMMONITORT, cfig )
SHMIMMONITORT_APP_STARTUP( SHMIMMONITORT )
SHMIMMONITORT_APP_LOGIC( SHMIMMONITORT )
#define SHMIMMONITORT_APP_STARTUP(SHMIMMONITORT)
Call shmimMonitorT::appStartup with error checking for a typedef-ed shmimMonitor.
#define SHMIMMONITORT_SETUP_CONFIG(SHMIMMONITORT, cfig)
Call shmimMonitorT::setupConfig with error checking for a typedef-ed shmimMonitor.
#define SHMIMMONITORT_APP_LOGIC(SHMIMMONITORT)
Call shmimMonitorT::appLogic with error checking for a typedef-ed shmimMonitor.
#define SHMIMMONITORT_APP_SHUTDOWN(SHMIMMONITORT)
Call shmimMonitorT::appShutodwn with error checking for a typedef-ed shmimMonitor.
#define SHMIMMONITORT_LOAD_CONFIG(SHMIMMONITORT, cfig)
Call shmimMonitorT::loadConfig with error checking for a typedef-ed shmimMonitor.


Definition at line 97 of file shmimMonitor.hpp.

Member Function Documentation

◆ appLogic()

template<class derivedT , class specificT >
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::appLogic

Checks the shmimMonitor thread.

This should be called in derivedT::appLogic as

with appropriate error checking.

Returns
0 on success
-1 on error, which is logged.

Definition at line 397 of file shmimMonitor.hpp.

◆ appShutdown()

template<class derivedT , class specificT >
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::appShutdown

Shuts down the shmimMonitor thread.

This should be called in derivedT::appShutdown as

with appropriate error checking.

Returns
0 on success
-1 on error, which is logged.

Definition at line 411 of file shmimMonitor.hpp.

◆ appStartup()

template<class derivedT , class specificT >
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::appStartup

Startup function.

Starts the shmimMonitor thread This should be called in derivedT::appStartup as

with appropriate error checking.

Returns
0 on success
-1 on error, which is logged.

Definition at line 329 of file shmimMonitor.hpp.

◆ dataType()

template<class derivedT , class specificT >
const uint8_t & MagAOX::app::dev::shmimMonitor< derivedT, specificT >::dataType

Definition at line 289 of file shmimMonitor.hpp.

◆ depth()

template<class derivedT , class specificT >
const uint32_t & MagAOX::app::dev::shmimMonitor< derivedT, specificT >::depth

Definition at line 283 of file shmimMonitor.hpp.

◆ derived()

template<class derivedT , class specificT = shmimT>
derivedT& MagAOX::app::dev::shmimMonitor< derivedT, specificT >::derived ( )
inlineprivate

Definition at line 254 of file shmimMonitor.hpp.

◆ height()

template<class derivedT , class specificT >
const uint32_t & MagAOX::app::dev::shmimMonitor< derivedT, specificT >::height

Definition at line 277 of file shmimMonitor.hpp.

◆ loadConfig()

template<class derivedT , class specificT >
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::loadConfig ( mx::app::appConfigurator &  config)

load the configuration system results

This should be called in derivedT::loadConfig as

int loadConfig(mx::app::appConfigurator &config)
load the configuration system results

with appropriate error checking.

Parameters
[in]configthe derived classes configurator

Definition at line 318 of file shmimMonitor.hpp.

◆ setupConfig()

template<class derivedT , class specificT >
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::setupConfig ( mx::app::appConfigurator &  config)

Setup the configuration system.

This should be called in derivedT::setupConfig as

int setupConfig(mx::app::appConfigurator &config)
Setup the configuration system.

with appropriate error checking.

Parameters
[out]configthe derived classes configurator

Definition at line 301 of file shmimMonitor.hpp.

◆ shmimName()

template<class derivedT , class specificT >
const std::string & MagAOX::app::dev::shmimMonitor< derivedT, specificT >::shmimName

Definition at line 265 of file shmimMonitor.hpp.

◆ smThreadExec()

template<class derivedT , class specificT >
void MagAOX::app::dev::shmimMonitor< derivedT, specificT >::smThreadExec
protected

Execute the monitoring thread.

<

Todo:
this isn't right--> isn't there a define in cacao to use?

< The semaphore to monitor for new image data

Todo:
change to naxis?
Todo:
change to naxis?

Definition at line 435 of file shmimMonitor.hpp.

Referenced by MagAOX::app::dev::shmimMonitor< derivedT, specificT >::smThreadStart().

◆ smThreadStart()

template<class derivedT , class specificT >
void MagAOX::app::dev::shmimMonitor< derivedT, specificT >::smThreadStart ( shmimMonitor< derivedT, specificT > *  s)
staticprotected

Thread starter, called by MagAOXApp::threadStart on thread construction. Calls smThreadExec.

Parameters
[in]sa pointer to a shmimMonitor instance (normally this)

Definition at line 429 of file shmimMonitor.hpp.

◆ typeSize()

template<class derivedT , class specificT >
const size_t & MagAOX::app::dev::shmimMonitor< derivedT, specificT >::typeSize

Definition at line 295 of file shmimMonitor.hpp.

◆ updateINDI()

template<class derivedT , class specificT >
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::updateINDI

Update the INDI properties for this device controller.

You should call this once per main loop. It is not called automatically.

Returns
0 on success.
-1 on error.

Definition at line 750 of file shmimMonitor.hpp.

◆ width()

template<class derivedT , class specificT >
const uint32_t & MagAOX::app::dev::shmimMonitor< derivedT, specificT >::width

Definition at line 271 of file shmimMonitor.hpp.

Member Data Documentation

◆ m_dataType

template<class derivedT , class specificT = shmimT>
uint8_t MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_dataType {0}
protected

The ImageStreamIO type code.

Definition at line 120 of file shmimMonitor.hpp.

◆ m_depth

template<class derivedT , class specificT = shmimT>
uint32_t MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_depth {0}
protected

The depth of the circular buffer in the stream.

Definition at line 118 of file shmimMonitor.hpp.

◆ m_getExistingFirst

template<class derivedT , class specificT = shmimT>
bool MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_getExistingFirst {false}
protected

If set to true by derivedT, any existing image will be grabbed and sent to processImage before waiting on the semaphore.

Definition at line 112 of file shmimMonitor.hpp.

◆ m_height

template<class derivedT , class specificT = shmimT>
uint32_t MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_height {0}
protected

The height of the images in the stream.

Definition at line 117 of file shmimMonitor.hpp.

◆ m_imageStream

template<class derivedT , class specificT = shmimT>
IMAGE MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_imageStream
protected

The ImageStreamIO shared memory buffer.

Definition at line 123 of file shmimMonitor.hpp.

◆ m_indiP_frameSize

template<class derivedT , class specificT = shmimT>
pcf::IndiProperty MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_indiP_frameSize
protected

Property used to report the current frame size.

Definition at line 239 of file shmimMonitor.hpp.

◆ m_indiP_shmimName

template<class derivedT , class specificT = shmimT>
pcf::IndiProperty MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_indiP_shmimName
protected

Property used to report the shmim buffer name.

Definition at line 237 of file shmimMonitor.hpp.

◆ m_inode

template<class derivedT , class specificT = shmimT>
ino_t MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_inode {0}
protected

The inode of the image stream file.

Definition at line 125 of file shmimMonitor.hpp.

◆ m_restart

template<class derivedT , class specificT = shmimT>
bool MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_restart {false}
protected

Flag indicating tha the shared memory should be reinitialized.

Definition at line 205 of file shmimMonitor.hpp.

◆ m_selfMonitor

template<class derivedT , class specificT >
shmimMonitor< derivedT, specificT > * MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_selfMonitor = nullptr
staticprotected

Static pointer to this (set in constructor). Used for getting out of the static SIGSEGV handler.

Definition at line 207 of file shmimMonitor.hpp.

◆ m_semaphoreNumber

template<class derivedT , class specificT = shmimT>
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_semaphoreNumber {5}
protected

The image structure semaphore index.

Definition at line 114 of file shmimMonitor.hpp.

◆ m_shmimName

template<class derivedT , class specificT = shmimT>
std::string MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_shmimName {""}
protected

The name of the shared memory image, is used in /tmp/<shmimName>.im.shm. Derived classes should set a default.

Definition at line 104 of file shmimMonitor.hpp.

◆ m_smCpuset

template<class derivedT , class specificT = shmimT>
std::string MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_smCpuset
protected

The cpuset to assign the shmimMonitor thread to. Ignored if empty (the default).

Definition at line 108 of file shmimMonitor.hpp.

◆ m_smThread

template<class derivedT , class specificT = shmimT>
std::thread MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_smThread
protected

A separate thread for the actual monitoring.

Definition at line 220 of file shmimMonitor.hpp.

◆ m_smThreadID

template<class derivedT , class specificT = shmimT>
pid_t MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_smThreadID {0}
protected

The s.m. thread PID.

Definition at line 216 of file shmimMonitor.hpp.

◆ m_smThreadInit

template<class derivedT , class specificT = shmimT>
bool MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_smThreadInit {true}
protected

Synchronizer for thread startup, to allow priority setting to finish.

Definition at line 214 of file shmimMonitor.hpp.

◆ m_smThreadPrio

template<class derivedT , class specificT = shmimT>
int MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_smThreadPrio {2}
protected

Priority of the shmimMonitor thread, should normally be > 00.

Definition at line 106 of file shmimMonitor.hpp.

◆ m_smThreadProp

template<class derivedT , class specificT = shmimT>
pcf::IndiProperty MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_smThreadProp
protected

The property to hold the s.m. thread details.

Definition at line 218 of file shmimMonitor.hpp.

◆ m_typeSize

template<class derivedT , class specificT = shmimT>
size_t MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_typeSize {0}
protected

The size of the type, in bytes. Result of sizeof.

Definition at line 121 of file shmimMonitor.hpp.

◆ m_width

template<class derivedT , class specificT = shmimT>
uint32_t MagAOX::app::dev::shmimMonitor< derivedT, specificT >::m_width {0}
protected

The width of the images in the stream.

Definition at line 116 of file shmimMonitor.hpp.


The documentation for this class was generated from the following file: