コード例 #1
0
ファイル: ow_parseoutput.c プロジェクト: M-o-a-T/owfs
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);
}
コード例 #2
0
ファイル: ow_cmciel.c プロジェクト: GrandHsu/iicontrollibs
/* 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 ;
}
コード例 #3
0
ファイル: ow_2450.c プロジェクト: bootc/owfs-cvsimport
/* 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 ;
}
コード例 #4
0
ファイル: ow_interface.c プロジェクト: GrandHsu/iicontrollibs
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 ;
}
コード例 #5
0
ファイル: ow_cmciel.c プロジェクト: GrandHsu/iicontrollibs
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 ;
}
コード例 #6
0
ファイル: ow_interface.c プロジェクト: GrandHsu/iicontrollibs
/* 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 ;
	}
}
コード例 #7
0
ファイル: ow_cmciel.c プロジェクト: GrandHsu/iicontrollibs
/* 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 ;
}
コード例 #8
0
ファイル: ow_stats.c プロジェクト: stromnet/owfs
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;
}
コード例 #9
0
ファイル: ow_interface.c プロジェクト: GrandHsu/iicontrollibs
static ZERO_OR_ERROR FS_bustime(struct one_wire_query *owq)
{
	OWQ_F(owq) = TVfloat( &(PN(owq)->selected_connection->bus_time) ) ;
	return 0;
}
コード例 #10
0
ファイル: ow_2436.c プロジェクト: GrandHsu/iicontrollibs
static ZERO_OR_ERROR FS_volts(struct one_wire_query *owq)
{
	return GB_to_Z_OR_E(OW_volts(&OWQ_F(owq), PN(owq))) ;
}
コード例 #11
0
ファイル: ow_2450.c プロジェクト: bootc/owfs-cvsimport
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)) ;
}
コード例 #12
0
ファイル: ow_2450.c プロジェクト: bootc/owfs-cvsimport
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) ) ;
}
コード例 #13
0
ファイル: ow_printparse.c プロジェクト: bootc/owfs-cvsimport
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");
}
コード例 #14
0
ファイル: ow_testerread.c プロジェクト: bootc/owfs-cvsimport
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
}