static void s_eo_armenv_sharedservices_synchronise(void)
{
//    eEresult_t res;
    eEprocess_t proc = (eEprocess_t)s_the_armenv.modinfo->info.entity.signature;
    
    if(ee_res_OK != ee_sharserv_part_proc_synchronise(proc, s_the_armenv.modinfo))
    {
        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "s_eo_armenv_sharedservices_synchronise(): cannot sync modinfo", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal);
    }
    
    // only the e-loader has a non-null brdinfo
    if(NULL != s_the_armenv.brdinfo)
    {
        eEboardInfo_t boardinfo;
        memcpy(&boardinfo, s_the_armenv.brdinfo, sizeof(eEboardInfo_t));
        boardinfo.uniqueid = hal_uniqueid_id64bit_get();
        if(ee_res_OK != ee_sharserv_info_boardinfo_synchronise(&boardinfo))
        {
            eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "s_eo_armenv_sharedservices_synchronise(): cannot sync brdinfo", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal);
        }
    }
    
    if(ee_res_OK != ee_sharserv_info_deviceinfo_get(&s_the_armenv.devinfo))
    {
        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "s_eo_armenv_sharedservices_synchronise(): cannot read devinfo", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal);
    }
 
}
Example #2
0
static void s_eom_thecreation(void)
{
    char str[96];
    
    snprintf(str, sizeof(str), "OSAL::tskinit: just started");
    eo_errman_Trace(eo_errman_GetHandle(), str, s_eobj_ownname);
    
    snprintf(str, sizeof(str), "OSAL::tskinit: about to init EOMtheTimerManager + EOMtheCallbackManager");
    eo_errman_Trace(eo_errman_GetHandle(), str, s_eobj_ownname);

    // start the services offered by embobj: timer manager and callback manager

    eom_timerman_Initialise(s_eom_system.tmrmancfg);
    eom_callbackman_Initialise(s_eom_system.cbkmancfg);
    
            
    snprintf(str, sizeof(str), "OSAL::tskinit: calling user-defined function");
    eo_errman_Trace(eo_errman_GetHandle(), str, s_eobj_ownname);
    
    // run user defined initialisation ...
    if(NULL != s_eom_system.user_init_fn)
    {
        s_eom_system.user_init_fn();
    }
    
    snprintf(str, sizeof(str), "OSAL::tskinit: has finished user-defined function");
    eo_errman_Trace(eo_errman_GetHandle(), str, s_eobj_ownname);
    
    
    snprintf(str, sizeof(str), "OSAL::tskinit: about to stop itself and start scheduling");
    eo_errman_Trace(eo_errman_GetHandle(), str, s_eobj_ownname);
}
Example #3
0
static void s_osal_cfg_on_fatal_error(void* task, osal_fatalerror_t errorcode, const char * errormsg)
{
    uint8_t tskid = 0;
    char str[64];    
    osal_task_id_get((osal_task_t*)task, &tskid);
    snprintf(str, sizeof(str), "osalerror %d taskid %d: %s", errorcode, tskid, errormsg);
    
    if(eobool_true == eo_errman_IsErrorHandlerConfigured(eo_errman_GetHandle()))
    {
        // ok ... use the error manager, either in its simple form or in its networked form
        eOerrmanDescriptor_t errdes = {0};
        errdes.code             = eoerror_code_get(eoerror_category_System, eoerror_value_SYS_osalerror);
        errdes.par16            = errorcode;
        errdes.par64            = 0;
        errdes.sourcedevice     = eo_errman_sourcedevice_localboard;
        errdes.sourceaddress    = 0;    
        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, str, "OSAL", &errdes);                
    }
    else
    {
        if(NULL != errormsg)
        {
            hal_trace_puts(errormsg);
        }
        

        // in case of fatal error we blink all leds but led1
        hal_led_init(hal_led0, NULL);
        hal_led_init(hal_led1, NULL);
        hal_led_init(hal_led2, NULL);
        hal_led_init(hal_led3, NULL);
        hal_led_init(hal_led4, NULL);
        hal_led_init(hal_led5, NULL);
    
        hal_led_off(hal_led0);
        hal_led_off(hal_led1);
        hal_led_off(hal_led2);
        hal_led_off(hal_led3);
        hal_led_off(hal_led4);
        hal_led_off(hal_led5);   

        for(;;)
        {
            hal_sys_delay(100);
            
            hal_led_toggle(hal_led0);
            //hal_led_toggle(hal_led1);
            hal_led_toggle(hal_led2);
            hal_led_toggle(hal_led3);
            hal_led_toggle(hal_led4);
            hal_led_toggle(hal_led5);  
        }
    }    
   
}
extern eOresult_t eov_mutex_hid_SetVTABLE(EOVmutex *p, eOres_fp_voidp_uint32_t v_take, eOres_fp_voidp_t v_release, eOres_fp_voidp_t v_delete)
{
    eo_errman_Assert(eo_errman_GetHandle(), (NULL != v_take), "eov_mutex_hid_SetVTABLE(): NULL v_take", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    eo_errman_Assert(eo_errman_GetHandle(), (NULL != v_release), "eov_mutex_hid_SetVTABLE(): NULL v_release", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    eo_errman_Assert(eo_errman_GetHandle(), (NULL != v_delete), "eov_mutex_hid_SetVTABLE(): NULL v_delete", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);

    p->vtable[VF00_take]            = (void*) v_take;
    p->vtable[VF01_release]         = (void*) v_release;
    p->vtable[VF02_delete]          = (void*) v_delete;

    return(eores_OK);
}
Example #5
0
static void s_hal_core_cfg_on_fatalerror(hal_fatalerror_t errorcode, const char * errormsg)
{
    if(eobool_true == eo_errman_IsErrorHandlerConfigured(eo_errman_GetHandle()))
    {
        // ok ... use the error manager, either in its simple form or in its networked form
        eOerrmanDescriptor_t errdes = {0};
        errdes.code             = eoerror_code_get(eoerror_category_System, eoerror_value_SYS_halerror);
        errdes.par16            = errorcode;
        errdes.par64            = 0;
        errdes.sourcedevice     = eo_errman_sourcedevice_localboard;
        errdes.sourceaddress    = 0;    
        eo_errman_Error(eo_errman_GetHandle(), (hal_fatalerror_warning == errorcode) ? eo_errortype_warning : eo_errortype_fatal, errormsg, "HAL", &errdes);                
    }
    else
    {
        if(NULL != errormsg)
        {
            hal_trace_puts(errormsg);
        }
        
        if(hal_fatalerror_warning == errorcode)
        {
            return;
        }

        // in case of fatal error we blink all leds but led0
        hal_led_init(hal_led0, NULL);
        hal_led_init(hal_led1, NULL);
        hal_led_init(hal_led2, NULL);
        hal_led_init(hal_led3, NULL);
        hal_led_init(hal_led4, NULL);
        hal_led_init(hal_led5, NULL);
    
        hal_led_off(hal_led0);
        hal_led_off(hal_led1);
        hal_led_off(hal_led2);
        hal_led_off(hal_led3);
        hal_led_off(hal_led4);
        hal_led_off(hal_led5);   

        for(;;)
        {
            hal_sys_delay(100);
            
            //hal_led_toggle(hal_led0);
            hal_led_toggle(hal_led1);
            hal_led_toggle(hal_led2);
            hal_led_toggle(hal_led3);
            hal_led_toggle(hal_led4);
            hal_led_toggle(hal_led5);  
        }
    }
}
static void s_eo_armenv_prepare(const eEmoduleInfo_t *modinfo, const eEboardInfo_t *brdinfo)
{
    eEprocess_t proc = (eEprocess_t)modinfo->info.entity.signature;

    // eval modinfo
    if((ee_entity_process == modinfo->info.entity.type) && (ee_procNone != proc))
    {
        s_the_armenv.modinfo = modinfo;
    }
    else
    {
         eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "s_eo_armenv_prepare(): wrong modinfo", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal);
    }
    
    // load brdinfo. it is non-NULL only in the loader
    s_the_armenv.brdinfo = brdinfo;


    s_the_armenv.eprocess = proc;
    
   

    switch(proc)
    {
        case ee_procLoader:
        { 
            s_the_armenv.codeprocoffset = (EENV_MEMMAP_ELOADER_ROMADDR-EENV_ROMSTART);  
        } break; 
        
        case ee_procUpdater:        
        {
            s_the_armenv.codeprocoffset = (EENV_MEMMAP_EUPDATER_ROMADDR-EENV_ROMSTART);    
        } break;
    
        case ee_procApplication:        
        {
            s_the_armenv.codeprocoffset = (EENV_MEMMAP_EAPPLICATION_ROMADDR-EENV_ROMSTART);    
        } break;  

        default:
        {
            eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "s_eo_armenv_prepare(): unsupported proc", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal);
        } break;
    
    }
 
// moved the forceoffset EENV_EAPPLICATION_FORCE_CODE_OFFSET_TO_ZERO isnide the eEmemorymap.h  file     
//    // however, if we have the following macro defined we want the e-proc to work at base address
//#ifdef EE_FORCE_CODE_PROC_OFFSET_TO_ZERO
//    s_the_armenv.codeprocoffset = 0;
//#endif

}
extern EOtransceiver * eo_boardtransceiver_Initialise(const eOboardtransceiver_cfg_t *cfg) 
{
    eOtransceiver_cfg_t txrxcfg = eo_transceiver_cfg_default;
    
    if(NULL != s_eo_theboardtrans.transceiver)
    {
        return(s_eo_theboardtrans.transceiver);
    }


    if(NULL == cfg)
    {
        cfg = &eo_boardtransceiver_cfg_default;
    }

    if(NULL == cfg->vectorof_endpoint_cfg)
    {
        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, s_eobj_ownname, "need a vector of endpoints");
    }

    if((0 == cfg->sizes.capacityoftxpacket) || (0 == cfg->sizes.capacityofrop) || (0 == cfg->sizes.capacityofropframeregulars) ||
       (0 == cfg->sizes.capacityofropframeoccasionals) || (0 == cfg->sizes.capacityofropframereplies) || (0 == cfg->sizes.maxnumberofregularrops))
    {
        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, s_eobj_ownname, "a cfg->sizes field is 0");
    }    
    
    // 1. init the proper transceiver cfg

    s_eo_theboardtrans.nvscfg = s_eo_boardtransceiver_nvscfg_get(cfg);
    

    txrxcfg.capacityoftxpacket             = cfg->sizes.capacityoftxpacket;
    txrxcfg.capacityofrop                  = cfg->sizes.capacityofrop;
    txrxcfg.capacityofropframeregulars     = cfg->sizes.capacityofropframeregulars;
    txrxcfg.capacityofropframeoccasionals  = cfg->sizes.capacityofropframeoccasionals;
    txrxcfg.capacityofropframereplies      = cfg->sizes.capacityofropframereplies;
    txrxcfg.maxnumberofregularrops         = cfg->sizes.maxnumberofregularrops;
    txrxcfg.remipv4addr                    = cfg->remotehostipv4addr;
    txrxcfg.remipv4port                    = cfg->remotehostipv4port;
    txrxcfg.nvscfg                         = s_eo_theboardtrans.nvscfg;
    txrxcfg.mutex_fn_new                   = cfg->mutex_fn_new;
    txrxcfg.protection                     = cfg->transprotection;
    
    s_eo_theboardtrans.transceiver = eo_transceiver_New(&txrxcfg);
    
    
    return(s_eo_theboardtrans.transceiver);        
}    
extern void eoprot_fun_UPDT_mc_controller_config_jointcoupling(const EOnv* nv, const eOropdescriptor_t* rd)
{
    eOmc_jointcouplingmatrix_t *mat = (eOmc_jointcouplingmatrix_t*)rd->data;
    
    /*
    float Ji[4][4];
    
    for (int i=0; i<4; ++i)
    {
        for (int j=0; j<4; ++j)
        {
            Ji[i][j]=(float)((*mat)[i][j])/16384.0f;
        }
    }
    */
    
    eo_emsController_set_Jacobian(*mat);
        
    #warning --> marco.accame: put in here the debug messages for jointcoupling (and then remove them)
        
    eOerrmanDescriptor_t errdes = {0};
    errdes.code                 = eoerror_code_get(eoerror_category_Debug, eoerror_value_DEB_tag00);
    errdes.param                = 0;
    errdes.sourcedevice         = eo_errman_sourcedevice_localboard;
    errdes.sourceaddress        = 0;  
    //char *str = NULL;
    char str[eomn_info_status_extra_sizeof] = {0};
 
    for (int i=0; i<4; ++i)
    {
        snprintf(str, sizeof(str), "r%d: %f %f %f %f", i, Ji[i][0], Ji[i][1], Ji[i][2], Ji[i][3]);             
        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_debug, str, NULL, &errdes);    
    }   
}
Example #9
0
extern eOresult_t eo_skin_SendReport(EOtheSKIN *p)
{
    if(NULL == p)
    {
        return(eores_NOK_nullpointer);
    }

    eo_errman_Error(eo_errman_GetHandle(), p->diagnostics.errorType, NULL, s_eobj_ownname, &p->diagnostics.errorDescriptor);
    
    eOerror_value_t errorvalue = eoerror_code2value(p->diagnostics.errorDescriptor.code);
    
    switch(errorvalue)
    {
        case eoerror_value_CFG_skin_failed_candiscovery:
        {
            eo_candiscovery2_SendLatestSearchResults(eo_candiscovery2_GetHandle());            
        } break;
        
        default:
        {
            // dont send any additional info
        } break;
    }       

    
    return(eores_OK);      
}
static void s_eo_currents_watchdog_CheckI2T(uint8_t motor, int16_t value)
{    
    //change sign to check absolute value
    if (value < 0)
        value = -value;
    
    uint32_t averageCurrent = s_eo_currents_watchdog_averageCalc_addValue( motor, value);
   
    if(!s_eo_currents_watchdog_averageCalc_collectDataIsCompleted(motor))
    {
        return;
    }
    // 1) calculate Ep
    float Ep_aux= (averageCurrent*averageCurrent) - s_eo_currents_watchdog.nominalCurrent2[motor];
    
    
    s_eo_currents_watchdog.accomulatorEp[motor] += Ep_aux;
    
    if(s_eo_currents_watchdog.accomulatorEp[motor] < 0) //Ep could not be smaller than zero
    {
        s_eo_currents_watchdog.accomulatorEp[motor] = 0;
    }

    // 2) check if current Ep is bigger than threshold then rais fault
    if( s_eo_currents_watchdog.accomulatorEp[motor] > s_eo_currents_watchdog.I2T_threshold[motor])
    {
        s_eo_currents_watchdog.motorinI2Tfault[motor] = eobool_true;
        
        MController_motor_raise_fault_i2t(motor);
    }
    else
    {
        //I need to raise I2T fault until the current system energy is not littler than I2T threshold divided 2. (we decided so....)
        if(s_eo_currents_watchdog.motorinI2Tfault[motor])
        {
            if(s_eo_currents_watchdog.accomulatorEp[motor] > (s_eo_currents_watchdog.I2T_threshold[motor]/2))
            {
                MController_motor_raise_fault_i2t(motor);
            }
            else
            {
                eOerrmanDescriptor_t errdes = {0};
                errdes.code                 = eoerror_code_get(eoerror_category_Debug, eoerror_value_DEB_tag00);
                errdes.par16                = motor;
                errdes.sourcedevice         = eo_errman_sourcedevice_localboard;
                errdes.sourceaddress        = 0;  
                char str[100];
                snprintf(str, sizeof(str), "Ep < I2T/2: now it is possible put in idle the motor");
                eo_errman_Error(eo_errman_GetHandle(), eo_errortype_debug, str, NULL, &errdes);
                
                s_eo_currents_watchdog.motorinI2Tfault[motor] = eobool_false;
            }
        }
    }
    
    // 3) reset average data
    s_eo_currents_watchdog_averageCalc_reset(motor);

}
Example #11
0
extern EOVtheCallbackManager * eov_callbackman_hid_Initialise(eOres_fp_vcbkmanp_cbk_voidp_uint32_t execute_fn, EOVtaskDerived *task)
{

    if(NULL != s_eov_callbackmanager.vtable[0]) 
    {
        // already initialised
        return(&s_eov_callbackmanager);
    } 
    
    eo_errman_Assert(eo_errman_GetHandle(), NULL != execute_fn, "eov_callbackman_hid_Initialise(): NULL execute_fn", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    eo_errman_Assert(eo_errman_GetHandle(), NULL != task, "eov_callbackman_hid_Initialise(): NULL task", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);

    s_eov_callbackmanager.vtable[VF00_execute]              = execute_fn;
    s_eov_callbackmanager.task                              = task;


    return(&s_eov_callbackmanager);   
} 
// marco.accame on Nov 26 2014: this function is triggered if function eom_emssocket_Transmit() fails
// to transmit a udp packet.
extern void eom_emsconfigurator_hid_userdef_onemstransceivererror(EOMtheEMStransceiver* p)
{    
    eOerrmanDescriptor_t errdes = {0};
    errdes.code             = eoerror_code_get(eoerror_category_System, eoerror_value_SYS_configurator_udptxfailure);
    errdes.par16            = 0;
    errdes.par64            = 0;
    errdes.sourcedevice     = eo_errman_sourcedevice_localboard;
    errdes.sourceaddress    = 0;    
    eo_errman_Error(eo_errman_GetHandle(), eo_errortype_warning, NULL, "EOMtheEMSconfigurator", &errdes); 
}
Example #13
0
void JointSet_send_debug_message(char *message, uint8_t jid)
{

    eOerrmanDescriptor_t errdes = {0};

    errdes.code             = eoerror_code_get(eoerror_category_Debug, eoerror_value_DEB_tag01);
    errdes.sourcedevice     = eo_errman_sourcedevice_localboard;
    errdes.sourceaddress    = jid;
    errdes.par16            = 0;
    errdes.par64            = 0;
    eo_errman_Error(eo_errman_GetHandle(), eo_errortype_debug, message, NULL, &errdes);

}
Example #14
0
extern EOfifo * eo_fifo_New(eOsizeitem_t item_size, eOsizecntnr_t capacity,
                            eOres_fp_voidp_uint32_t item_init, uint32_t init_arg, 
                            eOres_fp_voidp_voidp_t item_copy, eOres_fp_voidp_t item_clear,
                            EOVmutexDerived *mutex) 
{
    EOfifo *retptr = NULL; 
    
    // i get memory for a mutexfifo. it will never be null
    retptr = (EOfifo*) eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(EOfifo), 1);

    eo_errman_Assert(eo_errman_GetHandle(), (0 != item_size), "eo_fifo_New(): 0 item_size", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    eo_errman_Assert(eo_errman_GetHandle(), (0 != capacity), "eo_fifo_New(): 0 capacity", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    
    // now i fill the mutexfifo with a deque 
    retptr->dek = eo_deque_New(item_size, capacity, item_init, init_arg, item_copy, item_clear);

    // now i copy the passed mutex into mutexfifo. beware for future use, ... it may be NULL
    retptr->mutex = mutex;
 
    // ok, done
    return(retptr);
}
static void s_eom_emsdiscoverylistener_task_startup(EOMtask *p, uint32_t t)
{
    // open the socket
    EOaction_strg astg = {0};
    EOaction *onrx = (EOaction*)&astg;
    eo_action_SetEvent(onrx, emsdiscoverylistener_evt_packet_received, p);
    
    eo_socketdtg_Open(s_emsdiscoverylistener_singleton.socket, s_emsdiscoverylistener_singleton.cfg.localport, eo_sktdir_TXRX, eobool_false, 
                      NULL, onrx, NULL);   
    
    eo_errman_Trace(eo_errman_GetHandle(), "called _task_startup()", s_eobj_ownname);
                                
}
extern EOMtheTimerManager * eom_timerman_Initialise(const eOmtimerman_cfg_t *tmrmancfg) 
{

    if(NULL != s_eom_thetimermanager.tmrman) 
    {
        // already initialised
        return(&s_eom_thetimermanager);
    }

    if(NULL == tmrmancfg)
    {
        tmrmancfg = &eom_timerman_DefaultCfg;
    }
    
    // trying to initialise with wrong params error
    eo_errman_Assert(eo_errman_GetHandle(), (0 != tmrmancfg->messagequeuesize), "eom_timerman_Initialise(): 0 messagequeuesize", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    eo_errman_Assert(eo_errman_GetHandle(), (0 != tmrmancfg->stacksize), "eom_timerman_Initialise(): 0 stacksize", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    eo_errman_Assert(eo_errman_GetHandle(), (0 != tmrmancfg->priority), "eom_timerman_Initialise(): 0 priority", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
    
    // i get a basic timer manager with onnew, add and rem functions proper for osal. and an EOMmutex (by the way ... eom_mutex_New() never returns NULL).
    s_eom_thetimermanager.tmrman = eov_timerman_hid_Initialise(s_eom_timerman_OnNewTimer, s_eom_timerman_OnDelTimer, s_eom_timerman_AddTimer, s_eom_timerman_RemTimer, eom_mutex_New()); 

    // i prepare the task able to process actions associated to expiry of the timers 
    s_eom_thetimermanager.tskproc = eom_task_New(eom_mtask_MessageDriven,                          // type 
                                              tmrmancfg->priority,                                 // priority
                                              tmrmancfg->stacksize,                               // stacksize
                                              NULL,                                             // startup_fn 
                                              s_eom_timerman_tskproc_forever,                   // run_fn 
                                              tmrmancfg->messagequeuesize,                      // maxmessages: msg fifo can hold all timers 
                                              eok_reltimeINFINITE,                                  // timeoutorperiod
                                              NULL,
                                              sys_timerman,                               // nameofthetask_fn
                                              "timerman");                              
    
    
   
    return(&s_eom_thetimermanager);
}    
Example #17
0
extern EOsm * eo_sm_New(const eOsm_cfg_t * cfg) 
{
    EOsm *retptr = NULL;
   
    // verify that we have a non NULL cfg
    eo_errman_Assert(eo_errman_GetHandle(), (NULL != cfg), "eo_sm_New(): NULL cfg", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);    

    // i get the memory for the object. no need to check versus NULL because the memory pool already does it
    retptr = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(EOsm), 1);
    
    // now the obj has valid memory. i need to initialise it with other user-defined data, by means of cfg.
    s_eo_sm_Specialise(retptr, cfg);
    
    return(retptr);    
}
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 EOtheARMenvironment * eo_armenv_Initialise(const eEmoduleInfo_t *modinfo, const eEboardInfo_t *brdinfo)
{
    
    
    if(NULL == s_the_armenv.env)
    {
        // allow initialisation with null cfg ..... but not without the moduleinfo
        
        eo_errman_Assert(eo_errman_GetHandle(), (NULL != modinfo), "eo_armenv_Initialise(): NULL modinfo", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);
         
        s_eo_armenv_prepare(modinfo, brdinfo);
        
        // i initialise the base environment
        s_the_armenv.env = eov_env_hid_Initialise(s_eo_armenv_shareddata_sync, s_eo_armenv_code_proc_offset_get,
                                                                               s_eo_armenv_shareddata_ipnet_get,
                                                                               s_eo_armenv_shareddata_cannets_get,
                                                                               s_eo_armenv_eproc_get);
        
        
//         #warning --> acemor says: we make sure that the oui is not the infamous 0x112233 but ...
//         
//         
//         shalinfo_deviceinfo_t deviceinfo;
//         const uint64_t thenewoui = 0x0B9A70; //0xabcdef; 0x332211; 
//         
//         if(ee_res_OK != shalinfo_deviceinfo_get(&s_the_armenv.devinfo))
//         {
//             eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "cannot read deviceinfo", s_eobj_ownname, NULL);
//             //return(eores_NOK_generic);
//         }
//         
//         if(thenewoui != (0x0000000000ffffff & s_the_armenv.devinfo->ipnetwork.macaddress))
//         {        
//             memcpy(&deviceinfo, s_the_armenv.devinfo, sizeof(shalinfo_deviceinfo_t));
//             
//             deviceinfo.ipnetwork.macaddress = 0x0000FFFFFF000000 & s_the_armenv.devinfo->ipnetwork.macaddress;
//             deviceinfo.ipnetwork.macaddress |= thenewoui;
//             
//             shalinfo_deviceinfo_set(&deviceinfo);           
//         }

        
        
    }
    

    return(&s_the_armenv);
}
Example #20
0
extern EOfifoWord* eo_fifoword_New(eOsizecntnr_t capacity, EOVmutexDerived *mutex) 
{
    EOfifoWord *retptr = NULL; 
    
    // i get memory for a fifoword. it can never be NULL 
    retptr = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(EOfifoWord), 1);
   
    eo_errman_Assert(eo_errman_GetHandle(), (0 != capacity), "eo_fifoword_New(): 0 capacity", s_eobj_ownname, &eo_errman_DescrWrongParamLocal);

    // now i create a mutexfifo made of word (no ctor or dtor!) and i fill it into the fifo of 
    // the fifoword. it can never be NULL 
    retptr->fifo = eo_fifo_New(4, capacity, NULL, 0, NULL, NULL, mutex);

    // ok, done
    return(retptr);
}
static void s_eo_armenv_sharedservices_init(void)
{
//     eEresult_t res = ee_res_OK;
    
    if(ee_res_OK == ee_sharserv_isvalid())
    {
        // init sharserv
        sharserv_mode_t sharservmode = 
        {
            .onerror    = NULL,
            .initmode   = sharserv_base_initmode_forcestorageinit
        };
        
        if(ee_res_OK != ee_sharserv_init(&sharservmode))
        {
            eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "s_eo_armenv_sharedservices_init(): cannot init sharserv", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal);
        }        
    } 
Example #22
0
extern EOfakeStorage* eo_fakestrg_New(uint32_t id, uint32_t capacity, const void *defvalue, EOVmutexDerived *mtx)
{
    EOfakeStorage *retptr = NULL;  
    eov_strg_memmap_t *strgmem = NULL;    

    // i get the memory for the object
    retptr = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(EOfakeStorage), 1);

    eo_errman_Assert(eo_errman_GetHandle(), (0 != capacity), s_eobj_ownname, "capacity cannot be zero");

    // get the base object
    retptr->storage = eov_strg_hid_New(id, capacity, defvalue, mtx);
    
    // pass to it the virtual table
    
    eov_strg_hid_SetVTABLE(retptr->storage, 
                          (eOres_fp_voidp_uint32_uint32_cvoidp_t) s_eo_fakestrg_set, 
                          (eOres_fp_voidp_uint32_uint32_voidp_t) s_eo_fakestrg_get);


    // now initialise the derived object
    
    strgmem = s_eo_fakestrg_get_storagememory(retptr->storage);
    
    if((NULL == strgmem) || (id != strgmem->id))
    {
        // create new memory partition, mark it with id and capacity, set its content to defvalue
        
        strgmem = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(uint32_t) + sizeof(uint32_t) + capacity, 1);
        strgmem->id         = id;
        strgmem->capacity   = capacity;

        memcpy(strgmem->data, defvalue, strgmem->capacity);
    
    }
 
    // assign the partition to the object
    retptr->ram = (void*)strgmem;
 
    return(retptr);

}
extern EOYmutex* eoy_mutex_New(void) 
{
    EOYmutex *retptr = NULL;    

    // i get the memory for the yarp mutex object
    retptr = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(EOYmutex), 1);
    
    // i get the base mutex
    retptr->mutex = eov_mutex_hid_New();

    // init its vtable
    eov_mutex_hid_SetVTABLE(retptr->mutex, s_eoy_mutex_take, s_eoy_mutex_release, s_eoy_mutex_delete); 
    
    // i get a new yarp mutex
    retptr->acemutex = ace_mutex_new();

    // need to check because yarp may return NULL
    eo_errman_Assert(eo_errman_GetHandle(), (NULL != retptr->acemutex), s_eobj_ownname, "eoy_mutex_New(): ace cannot give a mutex", &eo_errman_DescrRuntimeErrorLocal);
    
    return(retptr);    
}
static void s_eo_currents_watchdog_CheckI2T(uint8_t motor, int16_t value)
{
    float I = value;
    
    s_eo_currents_watchdog.accomulatorEp[motor] += 0.001f*(I*I - s_eo_currents_watchdog.nominalCurrent2[motor]);
    
    if (s_eo_currents_watchdog.accomulatorEp[motor] < 0.0f) s_eo_currents_watchdog.accomulatorEp[motor] = 0.0f;

    // 2) check if current Ep is bigger than threshold then rais fault
    if( s_eo_currents_watchdog.accomulatorEp[motor] > s_eo_currents_watchdog.I2T_threshold[motor])
    {
        s_eo_currents_watchdog.motorinI2Tfault[motor] = eobool_true;
        
        MController_motor_raise_fault_i2t(motor);
    }
    else
    {
        //I need to raise I2T fault until the current system energy is not littler than I2T threshold divided 2. (we decided so....)
        if(s_eo_currents_watchdog.motorinI2Tfault[motor])
        {
            if(s_eo_currents_watchdog.accomulatorEp[motor] > (0.5f*s_eo_currents_watchdog.I2T_threshold[motor]))
            {
                MController_motor_raise_fault_i2t(motor);
            }
            else
            {
                eOerrmanDescriptor_t errdes = {0};
                errdes.code                 = eoerror_code_get(eoerror_category_Debug, eoerror_value_DEB_tag00);
                errdes.par16                = motor;
                errdes.sourcedevice         = eo_errman_sourcedevice_localboard;
                errdes.sourceaddress        = 0;  
                char str[100];
                snprintf(str, sizeof(str), "Ep < I2T/2: now it is possible put in idle the motor");
                eo_errman_Error(eo_errman_GetHandle(), eo_errortype_debug, str, NULL, &errdes);
                
                s_eo_currents_watchdog.motorinI2Tfault[motor] = eobool_false;
            }
        }
    }
}
// --------------------------------------------------------------------------------------------------------------------
// - definition of extern public functions
// --------------------------------------------------------------------------------------------------------------------
extern EOappTheSP* eo_appTheSP_Initialise(const eOappTheSP_cfg_t *cfg)
{
    EOappTheSP *retptr = NULL;

    if(NULL == cfg)
    {
        return(retptr);
    }
    
    retptr = &s_theSP;

    //save in obj its configuration
    memcpy(&(retptr->cfg), cfg, sizeof(eOappTheSP_cfg_t));
    retptr->appRunMode = applrunMode__default;
    
    s_eo_appTheSP_services_init(retptr);
    
    retptr->st = eO_appTheSP_st__inited;
    
    eo_errman_Error(eo_errman_GetHandle(), eo_errortype_info, s_eobj_ownname, "Services provider init OK");
    return(retptr);
}
static eOresult_t s_eo_armenv_shareddata_ipnet_get(EOVtheEnvironmentDerived *p, const void **ipnet)
{
    // ok, get back my type.
    //EOVtheEnvironment *armenv = (EOVtheEnvironment *)p;

//    #warning: we could remove teh check vs argument not NULL, as long as it is called correctly
//    if(NULL == armenv) 
//    {
//        return(eores_NOK_nullpointer);
//    }

    // it is a singleton boys ... thus i dont need using armenv s_the_armenv
    
    if(ee_res_OK != ee_sharserv_info_deviceinfo_get(&s_the_armenv.devinfo))
    {
        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_fatal, "s_eo_armenv_shareddata_ipnet_get(): cannot read devinfo", s_eobj_ownname, &eo_errman_DescrRuntimeErrorLocal);
        return(eores_NOK_generic);
    }
    
    *ipnet = &s_the_armenv.devinfo->ipnetwork;
    
    return(eores_OK);
}
extern EOconstLookupTbl * eo_constLookupTbl_New(eOsizecntnr_t capacity, uint16_t offset , eOres_fp_voidp_t exceptionMngFn, const void* itemsList)
{
    EOconstLookupTbl *retptr = NULL;
 
    if(NULL == itemsList)
    {
        return(retptr);
    }

    // i get the memory for the object. no need to check versus NULL because the memory pool already does it
    retptr = eo_mempool_GetMemory(eo_mempool_GetHandle(), eo_mempool_align_32bit, sizeof(EOconstLookupTbl), 1);


    // now the obj has valid memory. i need to initialise it with user-defined data,

    eo_errman_Assert(eo_errman_GetHandle(), (0 != capacity), s_eobj_ownname, "capacity is zero");

    retptr->capacity           = capacity;
    retptr->offset             = offset;
    retptr->exceptionMngFn     = exceptionMngFn;
    retptr->itemsList          = itemsList;     
    
    return(retptr);   
}
Example #28
0
extern void eom_emsapplcfg_hid_userdef_OnError(eOerrmanErrorType_t errtype, const char *info, eOerrmanCaller_t *caller, const eOerrmanDescriptor_t *des)
{
    const char empty[] = "EO?";
    const char *err = eo_errman_ErrorStringGet(eo_errman_GetHandle(), errtype);
    char str[128];
    EOMtheEMSapplCfg *emsapplcfg = eom_emsapplcfg_GetHandle();
    
    const char *eobjstr = (NULL != caller) ? (caller->eobjstr) : (empty);
    uint32_t taskid = (NULL != caller) ? (caller->taskid) : (0);

    if(emsapplcfg->errmng_haltrace_enabled)
    {
        snprintf(str, sizeof(str), "[%s] %s in tsk %d: %s", err, eobjstr, taskid, info);
        hal_trace_puts(str);
    }
    if(errtype <= eo_errortype_error)
    {
        return;
    }
    
    eov_sys_Stop(eov_sys_GetHandle());
    
    // init leds
    overridden_appl_led_error_init();
    
    // compute the mask of led to be toggled.
    uint8_t ledmask = 0xff;    
    if((NULL != caller) && (NULL != caller->eobjstr))
    {
        if(0 == strcmp(caller->eobjstr, "HAL"))
        {
            hl_bits_byte_bitclear(&ledmask, 0);           
        }
        else if(0 == strcmp(caller->eobjstr, "OSAL"))
        {
            hl_bits_byte_bitclear(&ledmask, 1);  
        }
        else if(0 == strcmp(caller->eobjstr, "IPAL"))
        {
            hl_bits_byte_bitclear(&ledmask, 2);  
        }
    }

    for(;;)
    {
        hal_sys_delay(100);
        
        if(hl_true == hl_bits_byte_bitcheck(ledmask, 0))
        {
            hal_led_toggle(hal_led0);
        }
        if(hl_true == hl_bits_byte_bitcheck(ledmask, 1))
        {
            hal_led_toggle(hal_led1);
        }
        if(hl_true == hl_bits_byte_bitcheck(ledmask, 2))
        {            
            hal_led_toggle(hal_led2);
        }
        
        hal_led_toggle(hal_led3);
        hal_led_toggle(hal_led4);
        hal_led_toggle(hal_led5);        
    }
}
extern void eoprot_fun_UPDT_mn_appl_cmmnds_go2state(const EOnv* nv, const eOropdescriptor_t* rd) 
{
    eOmn_appl_state_t *go2state = (eOmn_appl_state_t *)nv->ram;
    
    eOprotID32_t id32 = eoprot_ID_get(eoprot_endpoint_management, eoprot_entity_mn_appl, 0, eoprot_tag_mn_appl_status);
    eOmn_appl_status_t *status = (eOmn_appl_status_t*)eoprot_variable_ramof_get(eoprot_board_localboard, id32);

    eOresult_t res = eores_NOK_generic;
    
    switch(*go2state)
    {
        case applstate_config:
        {
            res = eom_emsappl_ProcessGo2stateRequest(eom_emsappl_GetHandle(), eo_sm_emsappl_STcfg);
            // the new currstate is set inside the on-entry of the state machine
            //if(eores_OK == res)
            //{   
            //    status->currstate = applstate_config;
            //}
        } break;

        case applstate_running:
        {
            uint32_t canBoardsReady = 0;
            uint32_t canBoardsChecked = 0;
            char str[60];
            if(eobool_false == eo_appTheDB_areConnectedCanBoardsReady(eo_emsapplBody_GetDataBaseHandle(eo_emsapplBody_GetHandle()), &canBoardsReady, &canBoardsChecked))
            {
                #warning marco.accame: put a dedicated diagnostics message with list of missing can boards
                snprintf(str, sizeof(str), "only 0x%x of of 0x%x.", canBoardsReady, canBoardsChecked);
                
                 
                // the new currstate is set inside the on-entry of the state machine               
                //status->currstate = applstate_error;
                // it MUST NOT be fatal error because we want to give the ems time to find the boards ready
                eo_errman_Error(eo_errman_GetHandle(), eo_errortype_error, str, "eoprot_fun_UPDT_mn_appl_cmmnds_go2state", &eo_errman_DescrUnspecified);
                return;
//                eo_errman_Error(eo_errman_GetHandle(), eo_errortype_error, str, "eoprot_fun_UPDT_mn_appl_cmmnds_go2state", &eo_errman_DescrUnspecified);
            }
            else
            {
                // marco.accame: if i send diagnostics messages just before going to running mode ... the application crashes. TO BE UNDERSTOOD WHY !
                //eo_emsapplBody_SignalDetectedCANboards(eo_emsapplBody_GetHandle());
//                // maybe in here we can put an info diagnostics message    
//                // send message about the ready boards
//                uint8_t numcanboards = eo_appTheDB_GetNumberOfCanboards(eo_appTheDB_GetHandle());
//                uint8_t i = 0;
//                eOappTheDB_board_canlocation_t loc = {0};
//                eObrd_cantype_t exptype = eobrd_cantype_unknown;
//                eObrd_typeandversions_t detected = {0};
//                
//                eOerrmanDescriptor_t des = {0};
//                des.code = eoerror_code_get(eoerror_category_Debug, eoerror_value_DEB_tag07);
//                
//                for(i=0; i<numcanboards; i++)
//                {
//                    if(eores_OK == eo_appTheDB_GetCanDetectedInfo(eo_appTheDB_GetHandle(), i, &loc, &exptype, &detected))
//                    {
//                        // fill the message. so far i use a debug with can-id-typedetected-typeexpectde
//                        des.sourcedevice    = (eOcanport1 == loc.emscanport) ? (eo_errman_sourcedevice_canbus1) : (eo_errman_sourcedevice_canbus2);
//                        des.sourceaddress   = loc.addr;
//                        des.param           = (exptype << 8) | (detected.boardtype); 
//                        eo_errman_Error(eo_errman_GetHandle(), eo_errortype_info, NULL, NULL, &des);
//                    }                    
//                }
            }
            
            res = eom_emsappl_ProcessGo2stateRequest(eom_emsappl_GetHandle(), eo_sm_emsappl_STrun);
            // the new currstate is set inside the on-entry of the state machine
            //if(eores_OK == res)
            //{   
            //    status->currstate = applstate_running;
            //}
        } break;
        
        case applstate_error:
        {
            //I don't expect to receive go to error cmd
            res = eom_emsappl_ProcessGo2stateRequest(eom_emsappl_GetHandle(), eo_sm_emsappl_STerr);
            // the new currstate is set inside the on-entry of the state machine
            //if(eores_OK == res)
            //{   
            //    status->currstate = applstate_error;
            //}
        } break;
        
        default:
        {
        } break;        
    }

}
static void s_eocanprotASperiodic_strain_saturation_handler(eOcanframe_t *frame, eOcanport_t port, strainProcessMode_t mode, uint16_t msg_counter)
{
    static uint16_t upper_saturations[6] = {0};
    static uint16_t lower_saturations[6] = {0};
    
    //there's saturation
    if (frame->size == 7)
    {
        uint8_t info = frame->data[6]; //byte containing info about saturation
    
        if (info != 0)
        {
            switch (mode)
            {
                case processForce:
                {
                    icubCanProto_strain_forceSaturationInfo_t* force_info = (icubCanProto_strain_forceSaturationInfo_t*) &info; 
                    
                    if (force_info->saturationInChannel_0 == saturationLOW)
                        lower_saturations[0]++;
                    else if (force_info->saturationInChannel_0 == saturationHIGH)
                        upper_saturations[0]++;
            
                    if (force_info->saturationInChannel_1 == saturationLOW)
                        lower_saturations[1]++;
                    else if (force_info->saturationInChannel_1 == saturationHIGH)
                        upper_saturations[1]++;
                   
                    if (force_info->saturationInChannel_2 == saturationLOW)
                         lower_saturations[2]++;
                    else if (force_info->saturationInChannel_2 == saturationHIGH)
                         upper_saturations[2]++;            
                } break;                 
                case processTorque:
                {
                    icubCanProto_strain_torqueSaturationInfo_t* torque_info = (icubCanProto_strain_torqueSaturationInfo_t*) &info;
                 
                    if (torque_info->saturationInChannel_3 == saturationLOW)
                        lower_saturations[3]++;
                    else if (torque_info->saturationInChannel_3 == saturationHIGH)
                        upper_saturations[3]++;
                    
                    if (torque_info->saturationInChannel_4 == saturationLOW)
                        lower_saturations[4]++;
                    else if (torque_info->saturationInChannel_4 == saturationHIGH)
                        upper_saturations[4]++;
                    
                    if (torque_info->saturationInChannel_5 == saturationLOW)
                        lower_saturations[5]++;
                    else if (torque_info->saturationInChannel_5 == saturationHIGH)
                        upper_saturations[5]++;
                } break;                
                
            }
        }
        else
        {
            // send diag message about malformed message
            // uncomment if you need it for debugging
            /*
            eOerrmanDescriptor_t errdes = {0};
            errdes.sourcedevice         = (eOcanport1 == port) ? (eo_errman_sourcedevice_canbus1) : (eo_errman_sourcedevice_canbus2);
            errdes.sourceaddress        = EOCANPROT_FRAME_GET_SOURCE(frame);                
            errdes.code                 = eoerror_code_get(eoerror_category_Debug, eoerror_value_DEB_tag01);
            errdes.par16                = 0;
            errdes.par64                = 0;
            eo_errman_Error(eo_errman_GetHandle(), eo_errortype_debug, "strain saturation byte 7 (if sent) should be different from 0!", NULL, &errdes);
            */
        }    
    
    }
    //send statistics every second (n.b. --> 2 CAN msgs from STRAIN every ms), but only if something happened
    if (msg_counter == 2000)
    { 
        //send saturation message for every channel, if any
        for (uint8_t i = 0; i < 6; i++)
        {
            eOerrmanDescriptor_t errdes = {0};
            if (upper_saturations[i] != 0 || lower_saturations[i] != 0)
            {
                errdes.sourcedevice         = (eOcanport1 == port) ? (eo_errman_sourcedevice_canbus1) : (eo_errman_sourcedevice_canbus2);
                errdes.sourceaddress        = EOCANPROT_FRAME_GET_SOURCE(frame);                
                errdes.code                 = eoerror_code_get(eoerror_category_HardWare, eoerror_value_HW_strain_saturation);
                errdes.par16                = i; //channel involved
                errdes.par64                = (uint64_t) (upper_saturations[i]) << 32 | (uint64_t) lower_saturations[i]; //LSW->lower_sat, MSW->upper_sat
                eo_errman_Error(eo_errman_GetHandle(), eo_errortype_error, NULL, NULL, &errdes);
                
                upper_saturations[i] = 0;
                lower_saturations[i] = 0;
            }
         }                     
    }
}