LCOV - code coverage report
Current view: top level - libMagAOX/logger/types - telem_observer.hpp (source / functions) Coverage Total Hit
Test: MagAOX Lines: 44.0 % 100 44
Test Date: 2026-01-03 21:03:39 Functions: 33.3 % 9 3

            Line data    Source code
       1              : /** \file telem_observer.hpp
       2              :  * \brief The MagAO-X logger telem_observer log type.
       3              :  * \author Jared R. Males (jaredmales@gmail.com)
       4              :  *
       5              :  * \ingroup logger_types_files
       6              :  *
       7              :  * History:
       8              :  * - 2018-09-06 created by JRM
       9              :  */
      10              : #ifndef logger_types_telem_observer_hpp
      11              : #define logger_types_telem_observer_hpp
      12              : 
      13              : #include "generated/telem_observer_generated.h"
      14              : #include "flatbuffer_log.hpp"
      15              : 
      16              : #include <cmath>
      17              : 
      18              : namespace MagAOX
      19              : {
      20              : namespace logger
      21              : {
      22              : 
      23              : /// Log entry recording the build-time git state.
      24              : /** \ingroup logger_types
      25              :  */
      26              : struct telem_observer : public flatbuffer_log
      27              : {
      28              :     /// The event code
      29              :     static const flatlogs::eventCodeT eventCode = eventCodes::TELEM_OBSERVER;
      30              : 
      31              :     /// The default level
      32              :     static const flatlogs::logPrioT defaultLevel = flatlogs::logPrio::LOG_TELEM;
      33              : 
      34              :     static timespec lastRecord; ///< The time of the last time this log was recorded.  Used by the telemetry system.
      35              : 
      36              :     /// The type of the input message
      37              :     struct messageT : public fbMessage
      38              :     {
      39              :         /// Construct from components
      40            1 :         messageT( const std::string &email,     ///< [in] observer email
      41              :                   const std::string &obsName,   ///< [in] observer email
      42              :                   const bool        &observing, ///< [in] status of observing
      43              :                   const std::string &tgtName,   ///< [in] the target name
      44              :                   const std::string &opEmail    ///< [in] operator email
      45              :         )
      46            1 :         {
      47            1 :             auto _email   = builder.CreateString( email );
      48            1 :             auto _obsName = builder.CreateString( obsName );
      49            1 :             auto _tgtName = builder.CreateString( tgtName );
      50            1 :             auto _opEmail = builder.CreateString( opEmail );
      51              : 
      52            1 :             auto fp = CreateTelem_observer_fb( builder, _email, _obsName, observing, _tgtName, _opEmail );
      53            1 :             builder.Finish( fp );
      54            1 :         }
      55              :     };
      56              : 
      57            1 :     static bool verify( flatlogs::bufferPtrT &logBuff, ///< [in] Buffer containing the flatbuffer serialized message.
      58              :                         flatlogs::msgLenT     len      ///< [in] length of msgBuffer.
      59              :     )
      60              :     {
      61            1 :         auto verifier = flatbuffers::Verifier( static_cast<uint8_t *>( flatlogs::logHeader::messageBuffer( logBuff ) ),
      62            1 :                                                static_cast<size_t>( len ) );
      63              : 
      64            1 :         bool ok = VerifyTelem_observer_fbBuffer( verifier );
      65            1 :         if( !ok )
      66            0 :             return ok;
      67              : 
      68            1 :         auto fbs = GetTelem_observer_fb( static_cast<uint8_t *>( flatlogs::logHeader::messageBuffer( logBuff ) ) );
      69              : 
      70            1 :         if( fbs->email() )
      71              :         {
      72            1 :             std::string email = fbs->email()->c_str();
      73           11 :             for( size_t n = 0; n < email.size(); ++n )
      74              :             {
      75           10 :                 if( !isprint( email[n] ) )
      76              :                 {
      77            0 :                     return false;
      78              :                 }
      79              :             }
      80            1 :         }
      81              : 
      82            1 :         if( fbs->obsName() )
      83              :         {
      84            1 :             std::string obsn = fbs->obsName()->c_str();
      85           11 :             for( size_t n = 0; n < obsn.size(); ++n )
      86              :             {
      87           10 :                 if( !isprint( obsn[n] ) )
      88              :                 {
      89            0 :                     return false;
      90              :                 }
      91              :             }
      92            1 :         }
      93              : 
      94            1 :         if( fbs->tgt_name() )
      95              :         {
      96            1 :             std::string tgtn = fbs->tgt_name()->c_str();
      97           11 :             for( size_t n = 0; n < tgtn.size(); ++n )
      98              :             {
      99           10 :                 if( !isprint( tgtn[n] ) )
     100              :                 {
     101            0 :                     return false;
     102              :                 }
     103              :             }
     104            1 :         }
     105              : 
     106            1 :         if( fbs->operator_email() )
     107              :         {
     108            1 :             std::string tgtn = fbs->operator_email()->c_str();
     109           11 :             for( size_t n = 0; n < tgtn.size(); ++n )
     110              :             {
     111           10 :                 if( !isprint( tgtn[n] ) )
     112              :                 {
     113            0 :                     return false;
     114              :                 }
     115              :             }
     116            1 :         }
     117              : 
     118            1 :         return ok;
     119              :     }
     120              : 
     121              :     /// Get the message formatted for human consumption.
     122            0 :     static std::string msgString( void *msgBuffer,      ///< [in] Buffer containing the flatbuffer serialized message.
     123              :                                   flatlogs::msgLenT len ///< [in] [unused] length of msgBuffer.
     124              :     )
     125              :     {
     126              :         static_cast<void>( len );
     127              : 
     128            0 :         auto fbs = GetTelem_observer_fb( msgBuffer );
     129              : 
     130            0 :         std::string msg = "[observer] ";
     131              : 
     132            0 :         if( fbs->email() )
     133              :         {
     134            0 :             msg += "email: ";
     135            0 :             msg += fbs->email()->c_str();
     136            0 :             msg += " ";
     137              :         }
     138              : 
     139            0 :         if( fbs->obsName() )
     140              :         {
     141            0 :             msg += "obs: ";
     142            0 :             msg += fbs->obsName()->c_str();
     143            0 :             msg += " ";
     144              :         }
     145              : 
     146            0 :         msg += std::to_string( fbs->observing() );
     147              : 
     148            0 :         if( fbs->tgt_name() )
     149              :         {
     150            0 :             msg += " tgt: ";
     151            0 :             msg += fbs->tgt_name()->c_str();
     152            0 :             msg += " ";
     153              :         }
     154              :         else
     155              :         {
     156            0 :             msg += " tgt: notimpl";
     157              :         }
     158              : 
     159            0 :         if( fbs->operator_email() )
     160              :         {
     161            0 :             msg += "operator: ";
     162            0 :             msg += fbs->operator_email()->c_str();
     163            0 :             msg += " ";
     164              :         }
     165              : 
     166            0 :         return msg;
     167            0 :     }
     168              : 
     169            0 :     static std::string email( void *msgBuffer )
     170              :     {
     171            0 :         auto fbs = GetTelem_observer_fb( msgBuffer );
     172            0 :         if( fbs->email() != nullptr )
     173              :         {
     174            0 :             return std::string( fbs->email()->c_str() );
     175              :         }
     176              :         else
     177            0 :             return "";
     178              :     }
     179              : 
     180            0 :     static std::string obsName( void *msgBuffer )
     181              :     {
     182            0 :         auto fbs = GetTelem_observer_fb( msgBuffer );
     183            0 :         if( fbs->email() != nullptr )
     184              :         {
     185            0 :             return std::string( fbs->obsName()->c_str() );
     186              :         }
     187              :         else
     188            0 :             return "";
     189              :     }
     190              : 
     191            0 :     static bool observing( void *msgBuffer )
     192              :     {
     193            0 :         auto fbs = GetTelem_observer_fb( msgBuffer );
     194            0 :         return fbs->observing();
     195              :     }
     196              : 
     197            0 :     static std::string tgtName( void *msgBuffer )
     198              :     {
     199            0 :         auto fbs = GetTelem_observer_fb( msgBuffer );
     200            0 :         if( fbs->tgt_name() != nullptr )
     201              :         {
     202            0 :             return std::string( fbs->tgt_name()->c_str() );
     203              :         }
     204              :         else
     205            0 :             return "notimpl";
     206              :     }
     207              : 
     208            0 :     static std::string operator_email( void *msgBuffer )
     209              :     {
     210            0 :         auto fbs = GetTelem_observer_fb( msgBuffer );
     211            0 :         if( fbs->operator_email() != nullptr )
     212              :         {
     213            0 :             return std::string( fbs->operator_email()->c_str() );
     214              :         }
     215              :         else
     216            0 :             return "";
     217              :     }
     218              : 
     219              :     /// Get the logMetaDetail for a member by name
     220              :     /**
     221              :      * \returns the a logMetaDetail filled in with the appropriate details
     222              :      * \returns an empty logMetaDetail if member not recognized
     223              :      */
     224            1 :     static logMetaDetail getAccessor( const std::string &member /**< [in] the name of the member */ )
     225              :     {
     226            1 :         if( member == "email" )
     227              :         {
     228              :             return logMetaDetail( { "OBSERVER",
     229              :                                     logMeta::valTypes::String,
     230              :                                     logMeta::metaTypes::State,
     231              :                                     reinterpret_cast<void *>( &email ),
     232            0 :                                     false } );
     233              :         }
     234            1 :         else if( member == "obsName" )
     235              :         {
     236              :             return logMetaDetail( { "OBSERVATION NAME",
     237              :                                     logMeta::valTypes::String,
     238              :                                     logMeta::metaTypes::State,
     239              :                                     reinterpret_cast<void *>( &obsName ),
     240            0 :                                     false } );
     241              :         }
     242            1 :         else if( member == "observing" )
     243              :         {
     244              :             return logMetaDetail( { "OBSERVING",
     245              :                                     logMeta::valTypes::Bool,
     246              :                                     logMeta::metaTypes::State,
     247            0 :                                     reinterpret_cast<void *>( &observing ) } );
     248              :         }
     249            1 :         else if( member == "tgtName" )
     250              :         {
     251              :             return logMetaDetail( { "TARGET NAME",
     252              :                                     logMeta::valTypes::String,
     253              :                                     logMeta::metaTypes::State,
     254              :                                     reinterpret_cast<void *>( &tgtName ),
     255            0 :                                     false } );
     256              :         }
     257            1 :         if( member == "operator_email" )
     258              :         {
     259              :             return logMetaDetail( { "OPERATOR",
     260              :                                     logMeta::valTypes::String,
     261              :                                     logMeta::metaTypes::State,
     262              :                                     reinterpret_cast<void *>( &operator_email ),
     263            0 :                                     false } );
     264              :         }
     265              :         else
     266              :         {
     267            1 :             std::cerr << "No member " << member << " in telem_observer\n";
     268            1 :             return logMetaDetail();
     269              :         }
     270              :     }
     271              : 
     272              : }; // telem_observer
     273              : 
     274              : } // namespace logger
     275              : } // namespace MagAOX
     276              : 
     277              : #endif // logger_types_telem_observer_hpp
        

Generated by: LCOV version 2.0-1