xref: /freebsd-src/contrib/opencsd/decoder/source/c_api/ocsd_c_api_obj.h (revision c120c5646da1a1d2c4d90fd069a7e2a8d559eb46)
1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner  * \file       ocsd_c_api_obj.h
3*c120c564SAndrew Turner  * \brief      OpenCSD : C API callback objects.
4*c120c564SAndrew Turner  *
5*c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6*c120c564SAndrew Turner  */
7*c120c564SAndrew Turner 
8*c120c564SAndrew Turner #ifndef ARM_OCSD_C_API_OBJ_H_INCLUDED
9*c120c564SAndrew Turner #define ARM_OCSD_C_API_OBJ_H_INCLUDED
10*c120c564SAndrew Turner 
11*c120c564SAndrew Turner #include "opencsd/c_api/ocsd_c_api_types.h"
12*c120c564SAndrew Turner #include "interfaces/trc_gen_elem_in_i.h"
13*c120c564SAndrew Turner #include "common/ocsd_msg_logger.h"
14*c120c564SAndrew Turner 
15*c120c564SAndrew Turner class TraceElemCBBase
16*c120c564SAndrew Turner {
17*c120c564SAndrew Turner public:
TraceElemCBBase()18*c120c564SAndrew Turner     TraceElemCBBase() {};
~TraceElemCBBase()19*c120c564SAndrew Turner     virtual ~TraceElemCBBase() {};
20*c120c564SAndrew Turner };
21*c120c564SAndrew Turner 
22*c120c564SAndrew Turner class GenTraceElemCBObj : public ITrcGenElemIn, public TraceElemCBBase
23*c120c564SAndrew Turner {
24*c120c564SAndrew Turner public:
25*c120c564SAndrew Turner     GenTraceElemCBObj(FnTraceElemIn pCBFn, const void *p_context);
~GenTraceElemCBObj()26*c120c564SAndrew Turner     virtual ~GenTraceElemCBObj() {};
27*c120c564SAndrew Turner 
28*c120c564SAndrew Turner     virtual ocsd_datapath_resp_t TraceElemIn(const ocsd_trc_index_t index_sop,
29*c120c564SAndrew Turner                                               const uint8_t trc_chan_id,
30*c120c564SAndrew Turner                                               const OcsdTraceElement &elem);
31*c120c564SAndrew Turner 
32*c120c564SAndrew Turner private:
33*c120c564SAndrew Turner     FnTraceElemIn m_c_api_cb_fn;
34*c120c564SAndrew Turner     const void *m_p_cb_context;
35*c120c564SAndrew Turner };
36*c120c564SAndrew Turner 
37*c120c564SAndrew Turner 
38*c120c564SAndrew Turner 
39*c120c564SAndrew Turner template<class TrcPkt>
40*c120c564SAndrew Turner class PktCBObj : public IPktDataIn<TrcPkt>
41*c120c564SAndrew Turner {
42*c120c564SAndrew Turner public:
PktCBObj(FnDefPktDataIn pCBFunc,const void * p_context)43*c120c564SAndrew Turner     PktCBObj( FnDefPktDataIn pCBFunc, const void *p_context)
44*c120c564SAndrew Turner     {
45*c120c564SAndrew Turner         m_c_api_cb_fn = pCBFunc;
46*c120c564SAndrew Turner         m_p_context = p_context;
47*c120c564SAndrew Turner     };
48*c120c564SAndrew Turner 
~PktCBObj()49*c120c564SAndrew Turner     virtual ~PktCBObj() {};
50*c120c564SAndrew Turner 
PacketDataIn(const ocsd_datapath_op_t op,const ocsd_trc_index_t index_sop,const TrcPkt * p_packet_in)51*c120c564SAndrew Turner     virtual ocsd_datapath_resp_t PacketDataIn( const ocsd_datapath_op_t op,
52*c120c564SAndrew Turner                                                const ocsd_trc_index_t index_sop,
53*c120c564SAndrew Turner                                                const TrcPkt *p_packet_in)
54*c120c564SAndrew Turner     {
55*c120c564SAndrew Turner         const void *c_pkt_struct = 0;
56*c120c564SAndrew Turner         if(op == OCSD_OP_DATA)
57*c120c564SAndrew Turner             c_pkt_struct = p_packet_in->c_pkt(); // always output the c struct packet
58*c120c564SAndrew Turner         return m_c_api_cb_fn(m_p_context,op,index_sop,c_pkt_struct);
59*c120c564SAndrew Turner     };
60*c120c564SAndrew Turner 
61*c120c564SAndrew Turner private:
62*c120c564SAndrew Turner     FnDefPktDataIn m_c_api_cb_fn;
63*c120c564SAndrew Turner     const void *m_p_context;
64*c120c564SAndrew Turner };
65*c120c564SAndrew Turner 
66*c120c564SAndrew Turner // void specialisation for custom decoders that pass packets as const void * pointers
67*c120c564SAndrew Turner template<>
68*c120c564SAndrew Turner class PktCBObj<void> : public IPktDataIn<void>
69*c120c564SAndrew Turner {
70*c120c564SAndrew Turner public:
PktCBObj(FnDefPktDataIn pCBFunc,const void * p_context)71*c120c564SAndrew Turner     PktCBObj(FnDefPktDataIn pCBFunc, const void *p_context)
72*c120c564SAndrew Turner     {
73*c120c564SAndrew Turner         m_c_api_cb_fn = pCBFunc;
74*c120c564SAndrew Turner         m_p_context = p_context;
75*c120c564SAndrew Turner     };
76*c120c564SAndrew Turner 
~PktCBObj()77*c120c564SAndrew Turner     virtual ~PktCBObj() {};
78*c120c564SAndrew Turner 
PacketDataIn(const ocsd_datapath_op_t op,const ocsd_trc_index_t index_sop,const void * p_packet_in)79*c120c564SAndrew Turner     virtual ocsd_datapath_resp_t PacketDataIn(const ocsd_datapath_op_t op,
80*c120c564SAndrew Turner         const ocsd_trc_index_t index_sop,
81*c120c564SAndrew Turner         const void *p_packet_in)
82*c120c564SAndrew Turner     {
83*c120c564SAndrew Turner         return m_c_api_cb_fn(m_p_context, op, index_sop, p_packet_in);
84*c120c564SAndrew Turner     };
85*c120c564SAndrew Turner 
86*c120c564SAndrew Turner private:
87*c120c564SAndrew Turner     FnDefPktDataIn m_c_api_cb_fn;
88*c120c564SAndrew Turner     const void *m_p_context;
89*c120c564SAndrew Turner };
90*c120c564SAndrew Turner 
91*c120c564SAndrew Turner 
92*c120c564SAndrew Turner template<class TrcPkt>
93*c120c564SAndrew Turner class PktMonCBObj : public IPktRawDataMon<TrcPkt>
94*c120c564SAndrew Turner {
95*c120c564SAndrew Turner public:
PktMonCBObj(FnDefPktDataMon pCBFunc,const void * p_context)96*c120c564SAndrew Turner     PktMonCBObj( FnDefPktDataMon pCBFunc, const void *p_context)
97*c120c564SAndrew Turner     {
98*c120c564SAndrew Turner         m_c_api_cb_fn = pCBFunc;
99*c120c564SAndrew Turner         m_p_context = p_context;
100*c120c564SAndrew Turner     };
101*c120c564SAndrew Turner 
~PktMonCBObj()102*c120c564SAndrew Turner     virtual ~PktMonCBObj() {};
103*c120c564SAndrew Turner 
RawPacketDataMon(const ocsd_datapath_op_t op,const ocsd_trc_index_t index_sop,const TrcPkt * p_packet_in,const uint32_t size,const uint8_t * p_data)104*c120c564SAndrew Turner     virtual void RawPacketDataMon( const ocsd_datapath_op_t op,
105*c120c564SAndrew Turner                                                const ocsd_trc_index_t index_sop,
106*c120c564SAndrew Turner                                                const TrcPkt *p_packet_in,
107*c120c564SAndrew Turner                                                const uint32_t size,
108*c120c564SAndrew Turner                                                const uint8_t *p_data)
109*c120c564SAndrew Turner     {
110*c120c564SAndrew Turner         const void *c_pkt_struct = 0;
111*c120c564SAndrew Turner         if(op == OCSD_OP_DATA)
112*c120c564SAndrew Turner             c_pkt_struct = p_packet_in->c_pkt(); // always output the c struct packet
113*c120c564SAndrew Turner         m_c_api_cb_fn(m_p_context,op,index_sop,c_pkt_struct,size,p_data);
114*c120c564SAndrew Turner     };
115*c120c564SAndrew Turner 
116*c120c564SAndrew Turner private:
117*c120c564SAndrew Turner     FnDefPktDataMon m_c_api_cb_fn;
118*c120c564SAndrew Turner     const void *m_p_context;
119*c120c564SAndrew Turner };
120*c120c564SAndrew Turner 
121*c120c564SAndrew Turner // void specialisation for custom decoders that pass packets as const void * pointers
122*c120c564SAndrew Turner template<>
123*c120c564SAndrew Turner class PktMonCBObj<void> : public IPktRawDataMon<void>
124*c120c564SAndrew Turner {
125*c120c564SAndrew Turner public:
PktMonCBObj(FnDefPktDataMon pCBFunc,const void * p_context)126*c120c564SAndrew Turner     PktMonCBObj(FnDefPktDataMon pCBFunc, const void *p_context)
127*c120c564SAndrew Turner     {
128*c120c564SAndrew Turner         m_c_api_cb_fn = pCBFunc;
129*c120c564SAndrew Turner         m_p_context = p_context;
130*c120c564SAndrew Turner     };
131*c120c564SAndrew Turner 
~PktMonCBObj()132*c120c564SAndrew Turner     virtual ~PktMonCBObj() {};
RawPacketDataMon(const ocsd_datapath_op_t op,const ocsd_trc_index_t index_sop,const void * p_packet_in,const uint32_t size,const uint8_t * p_data)133*c120c564SAndrew Turner     virtual void RawPacketDataMon(const ocsd_datapath_op_t op,
134*c120c564SAndrew Turner         const ocsd_trc_index_t index_sop,
135*c120c564SAndrew Turner         const void *p_packet_in,
136*c120c564SAndrew Turner         const uint32_t size,
137*c120c564SAndrew Turner         const uint8_t *p_data)
138*c120c564SAndrew Turner     {
139*c120c564SAndrew Turner         m_c_api_cb_fn(m_p_context, op, index_sop, p_packet_in, size, p_data);
140*c120c564SAndrew Turner     };
141*c120c564SAndrew Turner 
142*c120c564SAndrew Turner private:
143*c120c564SAndrew Turner     FnDefPktDataMon m_c_api_cb_fn;
144*c120c564SAndrew Turner     const void *m_p_context;
145*c120c564SAndrew Turner };
146*c120c564SAndrew Turner 
147*c120c564SAndrew Turner /* handler for default string print CB object */
148*c120c564SAndrew Turner class DefLogStrCBObj : public ocsdMsgLogStrOutI
149*c120c564SAndrew Turner {
150*c120c564SAndrew Turner public:
DefLogStrCBObj()151*c120c564SAndrew Turner     DefLogStrCBObj()
152*c120c564SAndrew Turner     {
153*c120c564SAndrew Turner         m_c_api_cb_fn = 0;
154*c120c564SAndrew Turner         m_p_context = 0;
155*c120c564SAndrew Turner     };
156*c120c564SAndrew Turner 
~DefLogStrCBObj()157*c120c564SAndrew Turner     virtual ~DefLogStrCBObj()
158*c120c564SAndrew Turner     {
159*c120c564SAndrew Turner         m_c_api_cb_fn = 0;
160*c120c564SAndrew Turner         m_p_context = 0;
161*c120c564SAndrew Turner     };
162*c120c564SAndrew Turner 
setCBFn(const void * p_context,FnDefLoggerPrintStrCB pCBFn)163*c120c564SAndrew Turner     void setCBFn(const void *p_context, FnDefLoggerPrintStrCB pCBFn)
164*c120c564SAndrew Turner     {
165*c120c564SAndrew Turner         m_c_api_cb_fn = pCBFn;
166*c120c564SAndrew Turner         m_p_context = p_context;
167*c120c564SAndrew Turner     };
168*c120c564SAndrew Turner 
printOutStr(const std::string & outStr)169*c120c564SAndrew Turner     virtual void printOutStr(const std::string &outStr)
170*c120c564SAndrew Turner     {
171*c120c564SAndrew Turner         if(m_c_api_cb_fn)
172*c120c564SAndrew Turner             m_c_api_cb_fn(m_p_context, outStr.c_str(), outStr.length());
173*c120c564SAndrew Turner     }
174*c120c564SAndrew Turner 
175*c120c564SAndrew Turner private:
176*c120c564SAndrew Turner     FnDefLoggerPrintStrCB m_c_api_cb_fn;
177*c120c564SAndrew Turner     const void *m_p_context;
178*c120c564SAndrew Turner };
179*c120c564SAndrew Turner 
180*c120c564SAndrew Turner #endif // ARM_OCSD_C_API_OBJ_H_INCLUDED
181*c120c564SAndrew Turner 
182*c120c564SAndrew Turner /* End of File ocsd_c_api_obj.h */
183