Exemple #1
0
//------------------------------------------------------------------------------
// Read temperatures and humidity. Pass a NULL pointer if you are not interested
// in the repective measurement value.
int mbug_2820_read( mbug_device dev, double *temperature, double *humidity )
{
	char data[16] = {0};
	int ret = 0;
	char* endp = 0;

	if (temperature != 0) *temperature = -300;
	if (humidity != 0) *humidity = -300;

	// Read 1st data packet
	ret = mbug_write( dev, "\xA0\x00\x01", 3);
	if (ret<0) return -1;
	ret = mbug_read( dev, data, 8 );
	if (ret<0) return -1;

	// Read 2nd data packet
	ret = mbug_write( dev, "\xA0\x01\x01", 3);
	if (ret<0) return -1;
	ret = mbug_read( dev, data+8, 8 );
	if (ret<0) return -1;

	// Convert temperature
	ret = 0;
	data[7] = '\0';
	if (temperature != 0) {
		errno = 0;
		*temperature = strtod(data, &endp);
		if (errno || *endp != '\0') {
			*temperature = -300;
			return -1;
		}
	}

	// Convert humidty
	data[15] = '\0';
	if (humidity != 0) {
		errno = 0;
		*humidity = strtod(data+8, &endp);
		if (errno || *endp != '\0') {
			*humidity = -300;
			return -1;
		}
	}

	// Test for device errors. Specific error code is located at data[5:6] as hex ascii.
	if (*temperature <= NOT_A_TEMPERATURE && data[4]=='\0' && data[5]!='\0') {
		*humidity = *temperature = -300 - strtol(data+5, 0, 16); // until an extended error handler is written: just add
		ret = -1;
	}

	return ret;
}
Exemple #2
0
//------------------------------------------------------------------------------
// Read all temperatures (ascii mode)
int mbug_2818_read_all( mbug_device dev, double temperatures[], int n )
{
	char data[64] = {0};
	int i, ret;
	
	if (n>8) n=8;
	for (i=0; i<n; i++) 
		temperatures[i] = NOT_A_TEMPERATURE;

	ret = mbug_write( dev, "\xFB\xA0", 2);
	if (ret<2) return -1;
	
	ret = mbug_read( dev, data, 64 );
	if (ret<64) return -1;
	data[63] = '\0';
	
	for (i=0; i<n; i++)
	{
		char* a = data + i*8;
		if ( !strncmp(a+1, "inf", 3) )	// thermometer returns "+inf" or "-inf" on overflow
			continue;
		temperatures[i] = atof(a);
	}

	return 0;
}
Exemple #3
0
//------------------------------------------------------------------------------
// Read the current temperature (ascii mode)
double mbug_2810_read_ascii( mbug_device dev )
{
	char tem[16] = {0};
	if (mbug_write( dev, "read", 5) <5)
		return NOT_A_TEMPERATURE;
	if (mbug_read( dev, tem, 8 ) <8)
		return NOT_A_TEMPERATURE;
	return atof(tem);
}
Exemple #4
0
//------------------------------------------------------------------------------
// Read raw sensor value
int mbug_2810_read_raw( mbug_device dev )
{
	unsigned char in[16] = {0};

	if (mbug_write( dev, "\xFA\xA0\xF2", 3) <3)	// Raw format (0xF2 is the old revisions read cmd)
		return NOT_A_TEMPERATURE;
	if (mbug_read( dev, in, 8 ) <8)
		return NOT_A_TEMPERATURE;
	return in[0]+(in[1]<<8);
}
Exemple #5
0
//------------------------------------------------------------------------------
// Read the current temperature (ascii mode)
double mbug_2810_read_ascii( mbug_device dev )
{
	char str[16] = {0};
	double tem;
	if (mbug_write( dev, "read", 5) <5)
		return NOT_A_TEMPERATURE;
	if (mbug_read( dev, str, 8 ) <8)
		return NOT_A_TEMPERATURE;
	tem = atof(str);
	if (tem < NOT_A_TEMPERATURE)
		tem -= strtol(str+5, 0, 16);
	return tem;
}
Exemple #6
0
//------------------------------------------------------------------------------
// Read raw data
long mbug_2820_read_raw( mbug_device dev )
{
	char data[8] = {0};
	int ret;

	ret = mbug_write( dev, "\xA0\x00\x00", 3);
	if (ret<0) return -1;

	ret = mbug_read( dev, data, 8 );
	if (ret<0) return -1;

	return *(long*)data;
}
Exemple #7
0
//------------------------------------------------------------------------------
// Private helper function:
//   Generic I/O command: Send cmd, receive integer parameter
//   Return values <0 indicate errors.
static int io( mbug_device dev,  unsigned char* out,  size_t size )
{
	unsigned char in[8] = {0};
	short status = 0;
	int value = 0;

	if (mbug_write( dev, out, size ) <0)
		return -1;
	if (mbug_read( dev, in, sizeof(in) ) <0)
		return -1;

	// First 2 bytes contain the return status (signed 16 bit)
	status = *(short*) in;
	// Next 4 bytes contain the returned output value
	value = *(int*) (in+2);
	if (status<0)  return status;
	else  return value;
}
Exemple #8
0
//------------------------------------------------------------------------------
// Read raw data
int mbug_2818_read_raw( mbug_device dev, unsigned short data[], int n )
{
	char data_in[64] = {0};
	int i, ret;
	
	if (n>8) n=8;
	for (i=0; i<n; i++) 
		data[i] = 0;

	ret = mbug_write( dev, "\xFA\xA0", 2);
	if (ret<2) return -1;
	
	ret = mbug_read( dev, data_in, 64 );
	if (ret<64) return -1;
	
	// Only the first 16 bytes carry values
	for (i=0; i<n; i++)
	{
		data[i] = data_in[i*2]+data_in[i*2+1]*256;
	}

	return 0;
}