// hal mutex scope-locked version of halpr_find_pin_by_name() hal_pin_t * hal_find_pin_by_name(const char *name) { hal_pin_t *p __attribute__((cleanup(halpr_autorelease_mutex))); rtapi_mutex_get(&(hal_data->mutex)); p = halpr_find_pin_by_name(name); return p; }
int set_channel_source(int chan_num, int type, char *name) { scope_vert_t *vert; scope_chan_t *chan; hal_pin_t *pin; hal_sig_t *sig; hal_param_t *param; vert = &(ctrl_usr->vert); chan = &(ctrl_usr->chan[chan_num - 1]); /* locate the selected item in the HAL */ if (type == 0) { /* search the pin list */ pin = halpr_find_pin_by_name(name); if (pin == NULL) { /* pin not found */ return -1; } chan->data_source_type = 0; chan->data_source = SHMOFF(pin); chan->data_type = pin->type; chan->name = pin->name; } else if (type == 1) { /* search the signal list */ sig = halpr_find_sig_by_name(name); if (sig == NULL) { /* signal not found */ return -1; } chan->data_source_type = 1; chan->data_source = SHMOFF(sig); chan->data_type = sig->type; chan->name = sig->name; } else if (type == 2) { /* search the parameter list */ param = halpr_find_param_by_name(name); if (param == NULL) { /* parameter not found */ return -1; } chan->data_source_type = 2; chan->data_source = SHMOFF(param); chan->data_type = param->type; chan->name = param->name; } switch (chan->data_type) { case HAL_BIT: chan->data_len = sizeof(hal_bit_t); chan->min_index = -2; chan->max_index = 2; break; case HAL_FLOAT: chan->data_len = sizeof(hal_float_t); chan->min_index = -36; chan->max_index = 36; break; case HAL_S32: chan->data_len = sizeof(hal_s32_t); chan->min_index = -2; chan->max_index = 30; break; case HAL_U32: chan->data_len = sizeof(hal_u32_t); chan->min_index = -2; chan->max_index = 30; break; default: /* Shouldn't get here, but just in case... */ chan->data_len = 0; chan->min_index = -1; chan->max_index = 1; } /* invalidate any data in the buffer for this channel */ vert->data_offset[chan_num - 1] = -1; /* set scale and offset to nominal values */ chan->vert_offset = 0.0; chan->scale_index = 0; /* return success */ return 0; }