static SIZE_OR_ERROR OWQ_parse_output_integer(struct one_wire_query *owq) { /* should only need suglen+1, but uClibc's snprintf() seem to trash 'len' if not increased */ int len; char c[PROPERTY_LENGTH_INTEGER + 2]; UCLIBCLOCK; if ( ShouldTrim(PN(owq)) ) { len = snprintf(c, PROPERTY_LENGTH_INTEGER + 1, "%1d", OWQ_I(owq)); } else { len = snprintf(c, PROPERTY_LENGTH_INTEGER + 1, "%*d", PROPERTY_LENGTH_INTEGER, OWQ_I(owq)); } UCLIBCUNLOCK; if ((len < 0) || ((size_t) len > PROPERTY_LENGTH_INTEGER)) { return -EMSGSIZE; } return OWQ_parse_output_offset_and_size(c, len, owq); }
/* mRS001 Rotation Sensor */ static ZERO_OR_ERROR FS_r_RPM(struct one_wire_query *owq) { UINT reading ; if ( FS_r_sibling_U( &reading, "reading", owq ) < 0 ) { return -EINVAL ; } OWQ_I(owq) = (int16_t) reading ; return 0 ; }
/* Simple number read */ static ZERO_OR_ERROR FS_r_read_number(struct one_wire_query *owq) { // Simple function that returns an integer. // More usual case would be to send instructions to the slave over the 1-wire bus // and return the (interpreted) result. OWQ_I(owq) = _EXAMPLE_SLAVE_DEFAULT_VALUE ; // OWQ structure holds the result. the format (integer in this case) comes from a // property field (ft_integer in this case) return 0; // no error }
void _print_owq(struct one_wire_query *owq) { char c[32]; fprintf(stderr,"OWQ OneWireQuery structure of %s\n", PN(owq)->path); fprintf(stderr," OneWireQuery size=%lu offset=%lu, extension=%d\n", (unsigned long) OWQ_size(owq), (unsigned long) OWQ_offset(owq), (int) OWQ_pn(owq).extension); if ( OWQ_buffer(owq) != NULL ) { Debug_Bytes("OneWireQuery buffer", (BYTE *) OWQ_buffer(owq), OWQ_size(owq)); } fprintf(stderr," Cleanup = %.4X",OWQ_cleanup(owq)); fprintf(stderr," OneWireQuery I=%d U=%u F=%G Y=%d D=%s\n", OWQ_I(owq), OWQ_U(owq), OWQ_F(owq), OWQ_Y(owq), SAFESTRING(ctime_r(&OWQ_D(owq), c))); fprintf(stderr,"--- OneWireQuery done\n"); }
static GOOD_OR_BAD OWQ_allocate_array( struct one_wire_query * owq ) { struct parsedname * pn = PN(owq) ; if (pn->extension == EXTENSION_ALL && pn->type != ePN_structure) { OWQ_array(owq) = owcalloc((size_t) pn->selected_filetype->ag->elements, sizeof(union value_object)); if (OWQ_array(owq) == NO_ONE_WIRE_QUERY) { return gbBAD ; } OWQ_cleanup(owq) |= owq_cleanup_array ; } else { OWQ_I(owq) = 0; } return gbGOOD ; }
static ZERO_OR_ERROR FS_read_tester_single(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); int tester_bus = (pn->sn[2] << 8) + pn->sn[1]; int device = (pn->sn[6] << 8) + pn->sn[5]; int family_code = pn->sn[0]; int calculated_value = family_code + tester_bus + device + pn->extension; switch (OWQ_pn(owq).selected_filetype->format) { case ft_integer: OWQ_I(owq) = calculated_value; break; case ft_yesno: OWQ_Y(owq) = calculated_value & 0x1; break; case ft_bitfield: if (OWQ_pn(owq).extension == EXTENSION_BYTE) { OWQ_U(owq) = calculated_value; } else { OWQ_Y(owq) = calculated_value & 0x1; } break; case ft_unsigned: OWQ_U(owq) = calculated_value; break; case ft_pressure: case ft_temperature: case ft_tempgap: case ft_float: OWQ_F(owq) = (_FLOAT) calculated_value *0.1;; break; case ft_date: OWQ_D(owq) = 1174622400; break; case ft_alias: case ft_vascii: case ft_ascii: { ASCII address[16]; size_t length_left = OWQ_size(owq); size_t buffer_index; size_t length = FileLength(PN(owq)); ASCII return_chars[length]; bytes2string(address, pn->sn, SERIAL_NUMBER_SIZE); OWQ_length(owq) = OWQ_size(owq); for (buffer_index = 0; buffer_index < length; buffer_index += sizeof(address)) { size_t copy_length = length_left; if (copy_length > sizeof(address)) { copy_length = sizeof(address); } memcpy(&return_chars[buffer_index], address, copy_length); length_left -= copy_length; } return OWQ_format_output_offset_and_size(return_chars, length, owq); } case ft_binary: { size_t length_left = OWQ_size(owq); size_t buffer_index; size_t length = FileLength(PN(owq)); ASCII return_chars[length]; OWQ_length(owq) = OWQ_size(owq); for (buffer_index = 0; buffer_index < length; buffer_index += SERIAL_NUMBER_SIZE) { size_t copy_length = length_left; if (copy_length > SERIAL_NUMBER_SIZE) { copy_length = SERIAL_NUMBER_SIZE; } memcpy(&return_chars[buffer_index], pn->sn, copy_length); length_left -= copy_length; } return OWQ_format_output_offset_and_size(return_chars, length, owq); } case ft_directory: case ft_subdir: case ft_unknown: return -ENOENT; } return 0; // put data as string into buffer and return length }