extern EOMtheEMSdiscoverylistener * eom_emsdiscoverylistener_Initialise(const eOemsdiscoverylistener_cfg_t *cfg) { if(NULL != s_emsdiscoverylistener_singleton.task) { return(&s_emsdiscoverylistener_singleton); } if(NULL == cfg) { cfg = &eom_emsdiscoverylistener_DefaultCfg; } memcpy(&s_emsdiscoverylistener_singleton.cfg, cfg, sizeof(eOemsdiscoverylistener_cfg_t)); if(NULL == eom_ipnet_GetHandle()) { eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "eom_emsdiscoverylistener_Initialise(): EOMtheIPnet not started yet", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal); } // create the socket s_emsdiscoverylistener_singleton.socket = eo_socketdtg_New(cfg->inpdatagramnumber, cfg->inpdatagramsizeof, (eobool_true == cfg->usemutex) ? (eom_mutex_New()) : (NULL), cfg->outdatagramnumber, cfg->outdatagramsizeof, (eobool_true == cfg->usemutex) ? (eom_mutex_New()) : (NULL) ); // create the rx packet s_emsdiscoverylistener_singleton.rxpkt = eo_packet_New(cfg->inpdatagramsizeof); // initialise the transceiver eOemsdiscoverytransceiver_cfg_t dtrcfg; dtrcfg.hostipv4addr = cfg->remoteipaddr; dtrcfg.hostipv4port = cfg->remoteport; dtrcfg.txpktcapacity = cfg->outdatagramsizeof; dtrcfg.discoveryprotocol = cfg->discoveryprotocol; dtrcfg.dbgshutdowntime = 0; // if 0 the shutdown timer is not started. otherwise it forces a got to updater. 3*60*eok_reltime1sec; eom_emsdiscoverytransceiver_Initialise(&dtrcfg); // create the task s_emsdiscoverylistener_singleton.task = eom_task_New(eom_mtask_EventDriven, cfg->taskpriority, cfg->taskstacksize, s_eom_emsdiscoverylistener_task_startup, s_eom_emsdiscoverylistener_task_run, (eOevent_t)0, eok_reltimeINFINITE, NULL, tskEMScfg, "tskEMSlis"); return(&s_emsdiscoverylistener_singleton); }
extern EOtransmitter* eo_transmitter_New(const eo_transmitter_cfg_t *cfg) { EOtransmitter *retptr = NULL; if(NULL == cfg) { cfg = &eo_transmitter_cfg_default; } // i get the memory for the object retptr = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(EOtransmitter), 1); retptr->txpacket = eo_packet_New(cfg->capacityoftxpacket); retptr->ropframereadytotx = eo_ropframe_New(); retptr->ropframeregulars = eo_ropframe_New(); retptr->ropframeoccasionals = eo_ropframe_New(); retptr->ropframereplies = eo_ropframe_New(); retptr->roptmp = eo_rop_New(cfg->capacityofrop); retptr->nvscfg = cfg->nvscfg; retptr->theagent = eo_agent_Initialise(NULL); retptr->ipv4addr = cfg->ipv4addr; retptr->ipv4port = cfg->ipv4port; retptr->bufferropframeregulars = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, cfg->capacityofropframeregulars, 1); retptr->bufferropframeoccasionals = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, cfg->capacityofropframeoccasionals, 1); retptr->bufferropframereplies = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, cfg->capacityofropframereplies, 1); retptr->listofregropinfo = (0 == cfg->maxnumberofregularrops) ? (NULL) : (eo_list_New(sizeof(eo_transm_regrop_info_t), cfg->maxnumberofregularrops, NULL, 0, NULL, NULL)); retptr->currenttime = 0; retptr->tx_seqnum = 0; eo_ropframe_Load(retptr->ropframeregulars, retptr->bufferropframeregulars, eo_ropframe_sizeforZEROrops, cfg->capacityofropframeregulars); eo_ropframe_Clear(retptr->ropframeregulars); eo_ropframe_Load(retptr->ropframeoccasionals, retptr->bufferropframeoccasionals, eo_ropframe_sizeforZEROrops, cfg->capacityofropframeoccasionals); eo_ropframe_Clear(retptr->ropframeoccasionals); eo_ropframe_Load(retptr->ropframereplies, retptr->bufferropframereplies, eo_ropframe_sizeforZEROrops, cfg->capacityofropframereplies); eo_ropframe_Clear(retptr->ropframereplies); { // we set the content of ropframereadytotx with the same memory used by txpacket, so that when we operate on // ropframereadytotx then we prepare the txpacket. uint8_t *data; uint16_t size; uint16_t capacity; eo_packet_Payload_Get(retptr->txpacket, &data, &size); eo_packet_Capacity_Get(retptr->txpacket, &capacity); eo_ropframe_Load(retptr->ropframereadytotx, data, eo_ropframe_sizeforZEROrops, capacity); // dont use size because size is now zero. eo_ropframe_Clear(retptr->ropframereadytotx); if(eobool_true != eo_ropframe_IsValid(retptr->ropframereadytotx)) { eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, s_eobj_ownname, "the ropframeready2tx is not valid... cannot continue"); } // the destination ipv4addr and ipv4port are constant and are the ones passed through configuration eo_packet_Addressing_Set(retptr->txpacket, retptr->ipv4addr, retptr->ipv4port); } if((NULL != cfg->mutex_fn_new) && (eo_transmitter_protection_total == cfg->protection)) { retptr->mtx_replies = cfg->mutex_fn_new(); retptr->mtx_regulars = cfg->mutex_fn_new(); retptr->mtx_occasionals = cfg->mutex_fn_new(); } else { retptr->mtx_replies = NULL; retptr->mtx_regulars = NULL; retptr->mtx_occasionals = NULL; } #if defined(USE_DEBUG_EOTRANSMITTER) // DEBUG retptr->debug.txropframeistoobigforthepacket = 0; #endif return(retptr); }