//------------------------------------------------------------------------------ // 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; }
//------------------------------------------------------------------------------ // 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; }
//------------------------------------------------------------------------------ // 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); }
//------------------------------------------------------------------------------ // 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); }
//------------------------------------------------------------------------------ // 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; }
//------------------------------------------------------------------------------ // 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; }
//------------------------------------------------------------------------------ // 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; }
//------------------------------------------------------------------------------ // 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; }