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
|