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