static msg_t PollTmp75Thread(void *arg) { chRegSetThreadName("PollTmp75"); (void)arg; while (TRUE) { /*chThdSleepMilliseconds(rand() & 31);*/ chThdSleepMilliseconds(15); /* Call reading function */ request_temperature(); } return 0; }
int vrpn_BiosciencesTools::reset(void) { //----------------------------------------------------------------------- // Sleep half a second and then drain the input buffer to make sure we start // with a fresh slate. vrpn_SleepMsecs(500); vrpn_flush_input_buffer(serial_fd); //----------------------------------------------------------------------- // Set the temperatures for channel 1 and 2 and then set the temperature // control to be on or off depending on what we've been asked to do. if (!set_reference_temperature(0, static_cast<float>(o_channel[0]))) { fprintf(stderr,"vrpn_BiosciencesTools::reset(): Cannot send set ref temp 0, trying again\n"); return -1; } if (!set_reference_temperature(1, static_cast<float>(o_channel[1]))) { fprintf(stderr,"vrpn_BiosciencesTools::reset(): Cannot send set ref temp 1, trying again\n"); return -1; } if (!set_control_status(o_channel[0] != 0)) { fprintf(stderr,"vrpn_BiosciencesTools::reset(): Cannot send set control status, trying again\n"); return -1; } //----------------------------------------------------------------------- // Send the command to request input from the first channel, and set up // the finite-state machine so we know which thing to request next. d_next_channel_to_read = 0; if (!request_temperature(d_next_channel_to_read)) { fprintf(stderr,"vrpn_BiosciencesTools::reset(): Cannot request temperature, trying again\n"); return -1; } // We're now waiting for any responses from devices status = STATUS_SYNCING; DO_WARNING("reset complete (this is good)"); vrpn_gettimeofday(×tamp, NULL); // Set watchdog now return 0; }
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; }