extern eOresult_t eo_nvset_InitBRD_LoadEPs(EOnvSet* p, eOnvsetOwnership_t ownership, eOipv4addr_t ipaddress, eOnvset_BRDcfg_t* cfgofbrd, eObool_t initNVs) { uint16_t nendpoints = 0; uint16_t i = 0; if((NULL == p) || (NULL == cfgofbrd)) { return(eores_NOK_nullpointer); } if(eores_OK != eo_nvset_InitBRD(p, ownership, ipaddress, cfgofbrd->boardnum)) { return(eores_NOK_generic); } nendpoints = eo_constvector_Size(cfgofbrd->epcfg_constvect); for(i=0; i<nendpoints; i++) { eOprot_EPcfg_t* pepcfg = (eOprot_EPcfg_t*) eo_constvector_At(cfgofbrd->epcfg_constvect, i); if(eobool_true == eoprot_EPcfg_isvalid(pepcfg)) { eo_nvset_LoadEP(p, pepcfg, initNVs); } else { //#warning TBD: put diagnostic message } } return(eores_OK); }
extern void eom_emsappl_hid_userdef_initialise(EOMtheEMSappl* p) { EOMtheEMSapplCfg* emsapplcfg = eom_emsapplcfg_GetHandle(); // the led-pulser is initted as first thing // pulse led3 forever at 20 hz. eo_ledpulser_Start(eo_ledpulser_GetHandle(), eo_ledpulser_led_three, EOK_reltime1sec/20, 0); { // marco.accame on 24 apr 2015: here is how to customise the eth protocol from a generic to a specific board // so far, we can keep it in here. but further on we shall customise one endpoint at a time in runtime. EOnvSet* nvset = eom_emstransceiver_GetNVset(eom_emstransceiver_GetHandle()); uint8_t i = 0; // 1. set the board number. the value of the generic board is 99. // the correct value is used only for retrieving it later on and perform specific actions based on the board number eo_nvset_BRDlocalsetnumber(nvset, s_boardnum); // 2. load all the endpoints specific to this board. the generic board loads only management for(i=0; i<s_theEPcfgsOthers_NumberOf; i++) { eOprot_EPcfg_t* epcfg = (eOprot_EPcfg_t*) &s_theEPcfgsOthers[i]; if(eobool_true == eoprot_EPcfg_isvalid(epcfg)) { eo_nvset_LoadEP(nvset, epcfg, eobool_true); } } // now we must define the .... proxy rules // if we have board number equal to 1 or 3 ... (eb2 or eb4) then we set it for mc only // in teh future we can set this proxy mode on teh basis of the board number received eOprotBRD_t localboard = eoprot_board_local_get(); if((1 == localboard) || (3 == localboard)) { eoprot_config_proxied_variables(eoprot_board_localboard, eoprot_endpoint_motioncontrol, eoprot_b02_b04_mc_isproxied); } } // initialise diagnostics eo_theEMSdgn_Initialize(); // start the application body //const eOemsapplbody_cfg_t *applbodycfg = &theemsapplbodycfg; const eOemsapplbody_cfg_t * applbodycfg = (const eOemsapplbody_cfg_t *)emsapplcfg->applbodycfg->thetrueconfig; eo_emsapplBody_Initialise(applbodycfg); }
extern eOresult_t eo_nvsetbrdbuilder_EP_Load(EOnvsetBRDbuilder* p, eOprot_EPcfg_t* epcfg) { EOvector *v = NULL; if((NULL == p) || (NULL == epcfg)) { return(eores_NOK_nullpointer); } if(eobool_false == eoprot_EPcfg_isvalid(epcfg)) { return(eores_NOK_generic); } // ok. now i put the item inside p->brdcfg->epcfg_constvect v = p->epcfg_vector; eo_vector_PushBack(v, epcfg); // and make sure that the constvector is udapted eo_constvector_Load(p->brdcfg->epcfg_constvect); return(eores_OK); }
extern void eom_emsappl_hid_userdef_initialise(EOMtheEMSappl* p) { EOMtheEMSapplCfg* emsapplcfg = eom_emsapplcfg_GetHandle(); // the led-pulser is initted as first thing // pulse led3 forever at 20 hz. eo_ledpulser_Start(eo_ledpulser_GetHandle(), eo_ledpulser_led_three, EOK_reltime1sec/20, 0); { // board number is from IP address s_boardnum = 0; eOipv4addr_t ipaddress = eom_ipnet_GetIPaddress(eom_ipnet_GetHandle()); s_boardnum = ipaddress >> 24; s_boardnum --; if(s_boardnum > 16) { //return; s_boardnum = 0; } //s_boardnum = 0; //it imposes that the board is the eb1 } { // CAN-MAPPING // marco.accame on 19 may 2015: here we load the map of can ... and also we map the entities into some can boards // ... if we have any. EOtheCANmapping * canmap = eo_canmap_Initialise(NULL); // now i load the map of can boards EOconstvector *canboards = eoboardconfig_code2canboards(s_boardnum); eo_canmap_LoadBoards(canmap, canboards); // now i load mc-joints, mc-motors, as-strain, as-mais, sk-skin EOconstvector *entitydes = NULL; // mc entitydes = eoboardconfig_code2entitydescriptors(s_boardnum, eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint); eo_canmap_ConfigEntity(canmap, eoprot_endpoint_motioncontrol, eoprot_entity_mc_joint, entitydes); entitydes = eoboardconfig_code2entitydescriptors(s_boardnum, eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor); eo_canmap_ConfigEntity(canmap, eoprot_endpoint_motioncontrol, eoprot_entity_mc_motor, entitydes); // as entitydes = eoboardconfig_code2entitydescriptors(s_boardnum, eoprot_endpoint_analogsensors, eoprot_entity_as_strain); eo_canmap_ConfigEntity(canmap, eoprot_endpoint_analogsensors, eoprot_entity_as_strain, entitydes); entitydes = eoboardconfig_code2entitydescriptors(s_boardnum, eoprot_endpoint_analogsensors, eoprot_entity_as_mais); eo_canmap_ConfigEntity(canmap, eoprot_endpoint_analogsensors, eoprot_entity_as_mais, entitydes); // sk entitydes = eoboardconfig_code2entitydescriptors(s_boardnum, eoprot_endpoint_skin, eoprot_entity_sk_skin); eo_canmap_ConfigEntity(canmap, eoprot_endpoint_skin, eoprot_entity_sk_skin, entitydes); } { // CAN-PROTOCOL EOtheCANprotocol * canprot = eo_canprot_Initialise(NULL); } { // ETH-PROTOCOL // marco.accame on 24 apr 2015: here is how to customise the eth protocol from a generic to a specific board // so far, we can keep it in here. but further on we shall customise one endpoint at a time in runtime. EOnvSet* nvset = eom_emstransceiver_GetNVset(eom_emstransceiver_GetHandle()); uint8_t i = 0; // 1. set the board number. the value of the generic board is 99. // the correct value is used only for retrieving it later on and perform specific actions based on the board number eo_nvset_BRDlocalsetnumber(nvset, s_boardnum); EOconstvector* epcfg_cvector = eoboardconfig_code2EPcfg(s_boardnum); // 2. load all the endpoints specific to this board. the generic board loads only management uint16_t numofepcfgs = eo_constvector_Size(epcfg_cvector); for(i=0; i<numofepcfgs; i++) { eOprot_EPcfg_t* epcfg = (eOprot_EPcfg_t*) eo_constvector_At(epcfg_cvector, i); if(eobool_true == eoprot_EPcfg_isvalid(epcfg)) { eo_nvset_LoadEP(nvset, epcfg, eobool_true); } } // now we must define the .... proxy rules // if we have board number equal to 1 or 3 ... (eb2 or eb4) then we set it for mc only eOprotBRD_t localboard = eoprot_board_local_get(); if((1 == localboard) || (3 == localboard)) { eoprot_config_proxied_variables(eoprot_board_localboard, eoprot_endpoint_motioncontrol, eoprot_b02_b04_mc_isproxied); } } // start the application body eOemsapplbody_cfg_t applbodyconfig; memcpy(&applbodyconfig, &theemsapplbodycfg, sizeof(eOemsapplbody_cfg_t)); // now i get the encoder config const eOappEncReader_cfg_t *enccfg = eoboardconfig_code2encoderconfig(s_boardnum); memcpy(&applbodyconfig.encoderreaderconfig, enccfg, sizeof(eOappEncReader_cfg_t)); eo_emsapplBody_Initialise(&applbodyconfig); }
static void s_eoprot_ep_mn_fun_configcommand(eOmn_command_t* command) { uint8_t size, i; eOropSIGcfg_t *sigcfg; eOropdescriptor_t ropdesc; EOtransceiver* theems00transceiver; //eOmn_cmd_config_t* cmdconfig = (eOmn_cmd_config_t*)&command->cmd; /////// not correct. eOmn_cmd_config_t* cmdconfig = &command->cmd.config; EOarray *array = (EOarray*)cmdconfig->array; uint16_t targetcapacity = (sizeof(cmdconfig->array) - sizeof(eOarray_head_t)) / sizeof(eOropSIGcfg_t); eOmn_opc_t opc = (eOmn_opc_t) cmdconfig->opcpar.opc; eOresult_t res; if(NULL == (theems00transceiver = eo_boardtransceiver_GetTransceiver(eo_boardtransceiver_GetHandle()))) { return; } switch(opc) { case eomn_opc_config_REGROPs_clear: { // just clear eo_transceiver_RegularROPs_Clear(theems00transceiver); } break; case eomn_opc_config_REGROPs_assign: { // clear and load all the sigcfg in the array if((eo_array_ItemSize(array) != sizeof(eOropSIGcfg_t)) || (targetcapacity != eo_array_Capacity(array)) || ((size = eo_array_Size(array)) > targetcapacity)) { return; } eo_transceiver_RegularROPs_Clear(theems00transceiver); for(i=0; i<size; i++) { sigcfg = (eOropSIGcfg_t*)eo_array_At(array, i); memcpy(&ropdesc.control, &eok_ropctrl_basic, sizeof(eOropctrl_t)); ropdesc.control.plustime = (eobool_true == cmdconfig->opcpar.plustime) ? (1) : (0); ropdesc.control.plussign = (eobool_true == cmdconfig->opcpar.plussign) ? (1) : (0); ropdesc.ropcode = eo_ropcode_sig; ropdesc.id32 = sigcfg->id32; ropdesc.signature = cmdconfig->opcpar.signature; res = eo_transceiver_RegularROP_Load(theems00transceiver, &ropdesc); res = res; if(eores_OK != res) { eo_theEMSdgn_UpdateApplCore(eo_theEMSdgn_GetHandle()); eo_theEMSdgn_Signalerror(eo_theEMSdgn_GetHandle(), eodgn_nvidbdoor_emsapplcommon , 1000); } } } break; case eomn_opc_config_REGROPs_append: { // dont clear and load all the sigcfg in the array if((eo_array_ItemSize(array) != sizeof(eOropSIGcfg_t)) || (targetcapacity != eo_array_Capacity(array)) || ((size = eo_array_Size(array)) > targetcapacity)) { return; } for(i=0; i<size; i++) { sigcfg = (eOropSIGcfg_t*)eo_array_At(array, i); memcpy(&ropdesc.control, &eok_ropctrl_basic, sizeof(eOropctrl_t)); ropdesc.control.plustime = (eobool_true == cmdconfig->opcpar.plustime) ? (1) : (0); ropdesc.control.plussign = (eobool_true == cmdconfig->opcpar.plussign) ? (1) : (0); ropdesc.ropcode = eo_ropcode_sig; ropdesc.id32 = sigcfg->id32; ropdesc.signature = cmdconfig->opcpar.signature; res = eo_transceiver_RegularROP_Load(theems00transceiver, &ropdesc); res = res; if(eores_OK != res) { eo_theEMSdgn_UpdateApplCore(eo_theEMSdgn_GetHandle()); eo_theEMSdgn_Signalerror(eo_theEMSdgn_GetHandle(), eodgn_nvidbdoor_emsapplcommon , 1000); } } } break; case eomn_opc_config_REGROPs_remove: { // remove all the sigcfg in the array if((eo_array_ItemSize(array) != sizeof(eOropSIGcfg_t)) || (targetcapacity != eo_array_Capacity(array)) || ((size = eo_array_Size(array)) > targetcapacity)) { return; } for(i=0; i<size; i++) { sigcfg = (eOropSIGcfg_t*)eo_array_At(array, i); memcpy(&ropdesc.control, &eok_ropctrl_basic, sizeof(eOropctrl_t)); ropdesc.control.plustime = (eobool_true == cmdconfig->opcpar.plustime) ? (1) : (0); ropdesc.control.plussign = (eobool_true == cmdconfig->opcpar.plussign) ? (1) : (0); ropdesc.ropcode = eo_ropcode_sig; ropdesc.id32 = sigcfg->id32; ropdesc.signature = cmdconfig->opcpar.signature; res = eo_transceiver_RegularROP_Unload(theems00transceiver, &ropdesc); res = res; } } break; case eomn_opc_config_PROT_boardnumber: { // simply set the byte in array[0] as the new localboard number //eOprotBRD_t brdnum = command->cmd.config.array[0]; eoprot_config_board_local(command->cmd.config.array[0]); } break; case eomn_opc_config_PROT_endpoint: { // simply use the bytes in array[0->7] as a eOprot_EPcfg_t. but only if the EP is valid and not loaded yet. eOprot_EPcfg_t *epcfg = (eOprot_EPcfg_t*) &command->cmd.config.array[0]; if(eobool_true == eoprot_EPcfg_isvalid(epcfg)) { if(eobool_false == eoprot_endpoint_configured_is(eoprot_board_localboard, epcfg->endpoint)) { EOnvSet* nvset = eom_emstransceiver_GetNVset(eom_emstransceiver_GetHandle()); eo_nvset_LoadEP(nvset, epcfg, eobool_true); } } } break; default: { } break; } }