📄 halcmd.c
字号:
rtapi_mutex_get(&(hal_data->mutex)); /* check if the pins are there */ first_pin = halpr_find_pin_by_name(first_pin_name); second_pin = halpr_find_pin_by_name(second_pin_name); if (first_pin == 0) { /* first pin not found*/ rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: pin '%s' not found\n", linenumber, first_pin_name); return HAL_INVAL; } else if (second_pin == 0) { rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: pin '%s' not found\n", linenumber, second_pin_name); return HAL_INVAL; } /* give the mutex, as the other functions use their own mutex */ rtapi_mutex_give(&(hal_data->mutex)); /* check that both pins have the same type, don't want ot create a sig, which after that won't be usefull */ if (first_pin->type != second_pin->type) { rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: pins '%s' and '%s' not of the same type\n", linenumber, first_pin_name, second_pin_name); return HAL_INVAL; } /* now create the signal */ retval = hal_signal_new(first_pin_name, first_pin->type); if (retval == HAL_SUCCESS) { /* if it worked, link the pins to it */ retval = hal_link(first_pin_name, first_pin_name); if ( retval == HAL_SUCCESS ) { /* if that worked, link the second pin to the new signal */ retval = hal_link(second_pin_name, first_pin_name); } } if (retval != HAL_SUCCESS) { rtapi_print_msg(RTAPI_MSG_ERR,"HAL:%d: linkpp failed\n", linenumber); } return retval;}static int do_link_cmd(char *pin, char *sig){ int retval; /* if sig is blank, want to unlink pin */ if (*sig == '\0') { /* tell hal_link() to unlink the pin */ sig = NULL; } /* make the link */ retval = hal_link(pin, sig); if (retval == 0) { /* print success message */ if (sig != NULL) { rtapi_print_msg(RTAPI_MSG_INFO, "Pin '%s' linked to signal '%s'\n", pin, sig); } else { rtapi_print_msg(RTAPI_MSG_INFO, "Pin '%s' unlinked\n", pin); } } else { rtapi_print_msg(RTAPI_MSG_ERR,"HAL:%d: link failed\n", linenumber); } return retval;}static int do_newsig_cmd(char *name, char *type){ int retval; if (strcasecmp(type, "bit") == 0) { retval = hal_signal_new(name, HAL_BIT); } else if (strcasecmp(type, "float") == 0) { retval = hal_signal_new(name, HAL_FLOAT); } else if (strcasecmp(type, "u8") == 0) { retval = hal_signal_new(name, HAL_U8); } else if (strcasecmp(type, "s8") == 0) { retval = hal_signal_new(name, HAL_S8); } else if (strcasecmp(type, "u16") == 0) { retval = hal_signal_new(name, HAL_U16); } else if (strcasecmp(type, "s16") == 0) { retval = hal_signal_new(name, HAL_S16); } else if (strcasecmp(type, "u32") == 0) { retval = hal_signal_new(name, HAL_U32); } else if (strcasecmp(type, "s32") == 0) { retval = hal_signal_new(name, HAL_S32); } else { rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: Unknown signal type '%s'\n", linenumber, type); retval = HAL_INVAL; } if (retval != HAL_SUCCESS) { rtapi_print_msg(RTAPI_MSG_ERR,"HAL:%d: newsig failed\n", linenumber); } return retval;}static int do_setp_cmd(char *name, char *value){ int retval; hal_param_t *param; hal_type_t type; void *d_ptr; char *cp; float fval; long lval; unsigned long ulval; rtapi_print_msg(RTAPI_MSG_DBG, "HAL: setting parameter '%s' to '%s'\n", name, value); cp = value; /* get mutex before accessing shared data */ rtapi_mutex_get(&(hal_data->mutex)); /* search param list for name */ param = halpr_find_param_by_name(name); if (param == 0) { rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: parameter '%s' not found\n", linenumber, name); return HAL_INVAL; } /* found it */ type = param->type; /* is it writable? */ if (param->dir == HAL_RD) { rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: param '%s' is not writable\n", linenumber, name); return HAL_INVAL; } d_ptr = SHMPTR(param->data_ptr); retval = 0; switch (type) { case HAL_BIT: if ((strcmp("1", value) == 0) || (strcasecmp("TRUE", value) == 0)) { *(hal_bit_t *) (d_ptr) = 1; } else if ((strcmp("0", value) == 0) || (strcasecmp("FALSE", value)) == 0) { *(hal_bit_t *) (d_ptr) = 0; } else { rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for bit parameter\n", linenumber, value); retval = HAL_INVAL; } break; case HAL_FLOAT: fval = strtod ( value, &cp ); if ((*cp != '\0') && (!isspace(*cp))) { /* invalid character(s) in string */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for float parameter\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_float_t *) (d_ptr)) = fval; } break; case HAL_S8: lval = strtol(value, &cp, 0); if (((*cp != '\0') && (!isspace(*cp))) || (lval > 127) || (lval < -128)) { /* invalid chars in string, or outside limits of S8 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for S8 parameter\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_s8_t *) (d_ptr)) = lval; } break; case HAL_U8: ulval = strtoul(value, &cp, 0); if (((*cp != '\0') && (!isspace(*cp))) || (ulval > 255)) { /* invalid chars in string, or outside limits of U8 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for U8 parameter\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_u8_t *) (d_ptr)) = ulval; } break; case HAL_S16: lval = strtol(value, &cp, 0); if (((*cp != '\0') && (!isspace(*cp))) || (lval > 32767) || (lval < -32768)) { /* invalid chars in string, or outside limits of S16 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for S16 parameter\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_s16_t *) (d_ptr)) = lval; } break; case HAL_U16: ulval = strtoul(value, &cp, 0); if (((*cp != '\0') && (!isspace(*cp))) || (ulval > 65535)) { /* invalid chars in string, or outside limits of U16 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for U16 parameter\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_u16_t *) (d_ptr)) = ulval; } break; case HAL_S32: lval = strtol(value, &cp, 0); if ((*cp != '\0') && (!isspace(*cp))) { /* invalid chars in string */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for S32 parameter\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_s32_t *) (d_ptr)) = lval; } break; case HAL_U32: ulval = strtoul(value, &cp, 0); if ((*cp != '\0') && (!isspace(*cp))) { /* invalid chars in string */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for U32 parameter\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_u32_t *) (d_ptr)) = ulval; } break; default: /* Shouldn't get here, but just in case... */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: bad type %d setting param '%s'\n", linenumber, type, name); retval = HAL_INVAL; } rtapi_mutex_give(&(hal_data->mutex)); if (retval == 0) { /* print success message */ rtapi_print_msg(RTAPI_MSG_INFO, "Parameter '%s' set to %s\n", name, value); } else { rtapi_print_msg(RTAPI_MSG_ERR,"HAL:%d: setp failed\n", linenumber); } return retval;}static int do_getp_cmd(char *name){ hal_param_t *param; hal_type_t type; void *d_ptr; rtapi_print_msg(RTAPI_MSG_DBG, "HAL: getting parameter '%s'\n", name); /* get mutex before accessing shared data */ rtapi_mutex_get(&(hal_data->mutex)); /* search param list for name */ param = halpr_find_param_by_name(name); if (param == 0) { rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: parameter '%s' not found\n", linenumber, name); return HAL_INVAL; } /* found it */ type = param->type; d_ptr = SHMPTR(param->data_ptr); rtapi_print("%s\n", data_value2((int) type, d_ptr)); rtapi_mutex_give(&(hal_data->mutex)); return HAL_SUCCESS;}static int do_sets_cmd(char *name, char *value){ int retval; hal_sig_t *sig; hal_type_t type; void *d_ptr; char *cp; float fval; long lval; unsigned long ulval; rtapi_print_msg(RTAPI_MSG_DBG, "HAL: setting signal '%s'\n", name); cp = value; /* get mutex before accessing shared data */ rtapi_mutex_get(&(hal_data->mutex)); /* search signal list for name */ sig = halpr_find_sig_by_name(name); if (sig == 0) { rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: signal '%s' not found\n", linenumber, name); return HAL_INVAL; } /* found it - does it have a writer? */ if (sig->writers > 0) { rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: signal '%s' already has writer(s)\n", linenumber, name); return HAL_INVAL; } /* no writer, so we can safely set it */ type = sig->type; d_ptr = SHMPTR(sig->data_ptr); retval = 0; switch (type) { case HAL_BIT: if ((strcmp("1", value) == 0) || (strcasecmp("TRUE", value) == 0)) { *(hal_bit_t *) (d_ptr) = 1; } else if ((strcmp("0", value) == 0) || (strcasecmp("FALSE", value)) == 0) { *(hal_bit_t *) (d_ptr) = 0; } else { rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for bit signal\n", linenumber, value); retval = HAL_INVAL; } break; case HAL_FLOAT: fval = strtod(value, &cp); if (*cp != '\0') { /* invalid chars in string */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for float signal\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_float_t *) (d_ptr)) = fval; } break; case HAL_S8: lval = strtol(value, &cp, 0); if ((*cp != '\0') || (lval > 127) || (lval < -128)) { /* invalid chars in string, or outside limits of S8 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for S8 signal\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_s8_t *) (d_ptr)) = lval; } break; case HAL_U8: ulval = strtoul(value, &cp, 0); if ((*cp != '\0') || (ulval > 255)) { /* invalid chars in string, or outside limits of U8 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for U8 signal\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_u8_t *) (d_ptr)) = ulval; } break; case HAL_S16: lval = strtol(value, &cp, 0); if ((*cp != '\0') || (lval > 32767) || (lval < -32768)) { /* invalid chars in string, or outside limits of S16 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for S16 signal\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_s16_t *) (d_ptr)) = lval; } break; case HAL_U16: ulval = strtoul(value, &cp, 0); if ((*cp != '\0') || (ulval > 65535)) { /* invalid chars in string, or outside limits of U16 */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for U16 signal\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_u16_t *) (d_ptr)) = ulval; } break; case HAL_S32: lval = strtol(value, &cp, 0); if (*cp != '\0') { /* invalid chars in string */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for S32 signal\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_s32_t *) (d_ptr)) = lval; } break; case HAL_U32: ulval = strtoul(value, &cp, 0); if (*cp != '\0') { /* invalid chars in string */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: value '%s' invalid for U32 signal\n", linenumber, value); retval = HAL_INVAL; } else { *((hal_u32_t *) (d_ptr)) = ulval; } break; default: /* Shouldn't get here, but just in case... */ rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: bad type %d setting signal '%s'\n", linenumber, type, name); retval = HAL_INVAL; } rtapi_mutex_give(&(hal_data->mutex)); if (retval == 0) { /* print success message */ rtapi_print_msg(RTAPI_MSG_INFO, "Signal '%s' set to %s\n", name, value); } else { rtapi_print_msg(RTAPI_MSG_ERR,"HAL:%d: sets failed\n", linenumber); } return retval;}static int do_gets_cmd(char *name){ hal_sig_t *sig; hal_type_t type; void *d_ptr; rtapi_print_msg(RTAPI_MSG_DBG, "HAL: getting signal '%s'\n", name); /* get mutex before accessing shared data */ rtapi_mutex_get(&(hal_data->mutex)); /* search signal list for name */ sig = halpr_find_sig_by_name(name); if (sig == 0) { rtapi_mutex_give(&(hal_data->mutex)); rtapi_print_msg(RTAPI_MSG_ERR, "HAL:%d: ERROR: signal '%s' not found\n", linenumber, name); return HAL_INVAL; } /* found it */ type = sig->type; d_ptr = SHMPTR(sig->data_ptr); rtapi_print("%s\n", data_value2((int) type, d_ptr)); rtapi_mutex_give(&(hal_data->mutex)); return HAL_SUCCESS;}static int do_show_cmd(char *type, char *pattern){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -