int vrpn_BiosciencesTools::get_report(void) { int ret; // Return value from function call to be checked //-------------------------------------------------------------------- // If we're SYNCing, then the next character we get should be the start // of a report. If we recognize it, go into READing mode and tell how // many characters we expect total. If we don't recognize it, then we // must have misinterpreted a command or something; reset // and start over //-------------------------------------------------------------------- if (status == STATUS_SYNCING) { // Try to get a character. If none, just return. if (vrpn_read_available_characters(serial_fd, (unsigned char *)(d_buffer), 1) != 1) { return 0; } d_expected_chars = 8; // Got the first character of a report -- go into READING mode // and record that we got one character at this time. The next // bit of code will attempt to read the rest of the report. // The time stored here is as close as possible to when the // report was generated. d_bufcount = 1; vrpn_gettimeofday(×tamp, NULL); status = STATUS_READING; #ifdef VERBOSE printf("... Got the 1st char\n"); #endif } //-------------------------------------------------------------------- // Read as many bytes of this report as we can, storing them // in the buffer. We keep track of how many have been read so far // and only try to read the rest. //-------------------------------------------------------------------- ret = vrpn_read_available_characters(serial_fd, (unsigned char *)(&d_buffer[d_bufcount]), d_expected_chars-d_bufcount); if (ret == -1) { DO_ERROR("Error reading"); status = STATUS_RESETTING; return 0; } d_bufcount += ret; #ifdef VERBOSE if (ret != 0) printf("... got %d characters (%d total)\n",ret, d_bufcount); #endif if (d_bufcount < d_expected_chars) { // Not done -- go back for more return 0; } d_buffer[d_expected_chars] = '\0'; // NULL terminate. //-------------------------------------------------------------------- // We now have enough characters to make a full report. Check to make // sure that its format matches what we expect. If it does, the next // section will parse it. // Store the report into the appropriate analog channel. //-------------------------------------------------------------------- float value = convert_bytes_to_reading(d_buffer); if (value == -1000) { char msg[256]; sprintf(msg,"Invalid report, channel %d, resetting", d_next_channel_to_read); DO_ERROR(msg); status = STATUS_RESETTING; } channel[d_next_channel_to_read] = value; #ifdef VERBOSE printf("got a complete report (%d of %d)!\n", d_bufcount, d_expected_chars); #endif //-------------------------------------------------------------------- // Request a reading from the next channe. //-------------------------------------------------------------------- d_next_channel_to_read = (d_next_channel_to_read + 1) % 6; if (!request_temperature(d_next_channel_to_read)) { char msg[256]; sprintf(msg,"Can't request reading, channel %d, resetting", d_next_channel_to_read); DO_ERROR(msg); status = STATUS_RESETTING; } //-------------------------------------------------------------------- // Done with the decoding, send the reports and go back to syncing //-------------------------------------------------------------------- report_changes(); status = STATUS_SYNCING; d_bufcount = 0; return 1; }
int vrpn_OmegaTemperature::get_report(void) { int ret; // Return value from function call to be checked //-------------------------------------------------------------------- // If we're SYNCing, then the next character we get should be the start // of a report. If we recognize it, go into READing mode and tell how // many characters we expect total. If we don't recognize it, then we // must have misinterpreted a command or something; reset // and start over //-------------------------------------------------------------------- if (status == STATUS_SYNCING) { // Try to get a character. If none, just return. if (vrpn_read_available_characters(serial_fd, (unsigned char *)(d_buffer), 1) != 1) { return 0; } // Got the first character of a report -- go into READING mode // and record that we got one character at this time. Clear the // rest of the buffer to 0's so that we won't be looking at old // data when we parse. // The time stored here is as close as possible to when the // report was generated. d_bufcount = 1; vrpn_gettimeofday(×tamp, NULL); status = STATUS_READING; size_t i; for (i = 1; i < sizeof(d_buffer); i++) { d_buffer[i] = 0; } #ifdef VERBOSE printf("... Got the 1st char\n"); #endif } //-------------------------------------------------------------------- // Read as many bytes of this report as we can, storing them // in the buffer. //-------------------------------------------------------------------- while ( 1 == (ret = vrpn_read_available_characters(serial_fd, (unsigned char *)(&d_buffer[d_bufcount]), 1))) { d_bufcount++; } if (ret == -1) { VRPN_MSG_ERROR("Error reading"); status = STATUS_RESETTING; return 0; } #ifdef VERBOSE if (ret != 0) printf("... got %d total characters\n", d_bufcount); #endif if (d_buffer[d_bufcount-1] != '\r') { // Not done -- go back for more return 0; } //-------------------------------------------------------------------- // We now have enough characters to make a full report. Check to make // sure that its format matches what we expect. If it does, the next // section will parse it. // Store the report into the appropriate analog channel. //-------------------------------------------------------------------- #ifdef VERBOSE printf(" Complete report: \n%s\n",d_buffer); #endif float value = convert_bytes_to_reading(d_buffer); if (value == -1000) { char msg[256]; sprintf(msg,"Invalid report, channel %d, resetting", d_next_channel_to_read); VRPN_MSG_ERROR(msg); status = STATUS_RESETTING; } channel[d_next_channel_to_read] = value; #ifdef VERBOSE printf("got a complete report (%d chars)!\n", d_bufcount); #endif //-------------------------------------------------------------------- // Request a reading from the next channe. //-------------------------------------------------------------------- d_next_channel_to_read = (d_next_channel_to_read + 1) % 6; if (!request_temperature(d_next_channel_to_read)) { char msg[256]; sprintf(msg,"Can't request reading, channel %d, resetting", d_next_channel_to_read); VRPN_MSG_ERROR(msg); status = STATUS_RESETTING; } //-------------------------------------------------------------------- // Done with the decoding, send the reports and go back to syncing //-------------------------------------------------------------------- report_changes(); status = STATUS_SYNCING; d_bufcount = 0; return 1; }