static SIZE_OR_ERROR OWQ_parse_output_float(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_FLOAT + 2]; _FLOAT F; switch (OWQ_pn(owq).selected_filetype->format) { case ft_pressure: F = Pressure(OWQ_F(owq), PN(owq)); break; case ft_temperature: F = Temperature(OWQ_F(owq), PN(owq)); break; case ft_tempgap: F = TemperatureGap(OWQ_F(owq), PN(owq)); break; default: F = OWQ_F(owq); break; } UCLIBCLOCK; if ( ShouldTrim(PN(owq)) ) { len = snprintf(c, PROPERTY_LENGTH_FLOAT + 1, "%1G", F); } else { len = snprintf(c, PROPERTY_LENGTH_FLOAT + 1, "%*G", PROPERTY_LENGTH_FLOAT, F); } UCLIBCUNLOCK; if ((len < 0) || ((size_t) len > PROPERTY_LENGTH_FLOAT)) { return -EMSGSIZE; } return OWQ_parse_output_offset_and_size(c, len, owq); }
/* mTS017 */ static ZERO_OR_ERROR FS_r_temperature(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); UINT reading ; if ( FS_r_sibling_U( &reading, "reading", owq ) < 0 ) { return -EINVAL ; } // Is this the correct type? if ( (reading & mTS017_type) == pn->selected_filetype->data.u ) { // Pare off top 2 bits and sign extend OWQ_F(owq) = ( ( (int16_t)(reading << 2) ) / 4 ) / 10. ; return 0 ; } // Is it a multiplex? Then try again if ( (reading & mTS017_plex) == mTS017_multi ) { // reread if ( FS_r_sibling_U( &reading, "reading", owq ) < 0 ) { return -EINVAL ; } // Is this the correct type? if ( (reading & mTS017_type) == pn->selected_filetype->data.u ) { // Pare off top 2 bits and sign extend OWQ_F(owq) = ( ( (int16_t)(reading << 2) ) / 4 ) / 10. ; return 0 ; } } else { // switch mode if we knew how } return -EINVAL ; }
/* Functions for the CO2 sensor */ static ZERO_OR_ERROR FS_CO2_power( struct one_wire_query *owq) { _FLOAT P = 0. ; ZERO_OR_ERROR z_or_e = FS_r_sibling_F(&P,"volt.D",owq) ; OWQ_F(owq) = P ; return z_or_e ; }
static ZERO_OR_ERROR FS_w_templimit(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); switch ( get_busmode(pn->selected_connection) ) { case bus_fake: case bus_mock: case bus_tester: if (pn->selected_filetype->data.i) { pn->selected_connection->master.fake.templow = OWQ_F(owq); } else { pn->selected_connection->master.fake.temphigh = OWQ_F(owq); } return 0; default: break ; } return 0 ; }
static ZERO_OR_ERROR FS_r_AM001_v(struct one_wire_query *owq) { UINT reading ; if ( FS_r_sibling_U( &reading, "reading", owq ) < 0 ) { return -EINVAL ; } OWQ_F(owq) = 10. * reading / 10000. ; return 0 ; }
/* fake adapter temperature limits */ static ZERO_OR_ERROR FS_r_templimit(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); switch ( get_busmode(pn->selected_connection) ) { case bus_fake: case bus_mock: case bus_tester: OWQ_F(owq) = pn->selected_filetype->data.i ? pn->selected_connection->master.fake.templow : pn->selected_connection->master.fake.temphigh; return 0; default: return -ENOTSUP ; } }
/* mvM001 Vibration */ static ZERO_OR_ERROR FS_r_vibration(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); UINT reading ; BYTE vib_mode = pn->selected_filetype->data.i ; if ( FS_w_sibling_U( vib_mode, "configure/read_mode", owq ) < 0 ) { return -EINVAL ; } if ( FS_r_sibling_U( &reading, "reading", owq ) < 0 ) { return -EINVAL ; } OWQ_F(owq) = .01 * reading ; return -EINVAL ; }
static ZERO_OR_ERROR FS_time(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); int dindex = pn->extension; struct timeval *tv; if (dindex < 0) { dindex = 0; } if (pn->selected_filetype == NO_FILETYPE) { return -ENOENT; } tv = (struct timeval *) pn->selected_filetype->data.v; if (tv == NULL) { return -ENOENT; } STATLOCK; OWQ_F(owq) = TVfloat( &(tv[dindex]) ) ; STATUNLOCK; return 0; }
static ZERO_OR_ERROR FS_bustime(struct one_wire_query *owq) { OWQ_F(owq) = TVfloat( &(PN(owq)->selected_connection->bus_time) ) ; return 0; }
static ZERO_OR_ERROR FS_volts(struct one_wire_query *owq) { return GB_to_Z_OR_E(OW_volts(&OWQ_F(owq), PN(owq))) ; }
static ZERO_OR_ERROR FS_w_setvolt(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); RETURN_ERROR_IF_BAD( FS_w_sibling_Y( 0, "set_alarm/unset", owq ) ) ; return GB_to_Z_OR_E(OW_w_vset( OWQ_F(owq), pn->selected_filetype->data.i, pn)) ; }
static ZERO_OR_ERROR FS_r_setvolt(struct one_wire_query *owq) { struct parsedname *pn = PN(owq); return GB_to_Z_OR_E( OW_r_vset( &OWQ_F(owq), pn->selected_filetype->data.i, pn) ) ; }
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 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 }