close the serial file descriptor in destructor

This commit is contained in:
Stephen Birarda 2013-05-06 13:25:49 -07:00
parent 37f1360542
commit 6666229d83
2 changed files with 29 additions and 22 deletions

View file

@ -22,7 +22,6 @@
#include <string> #include <string>
#endif #endif
int serialFd;
const int MAX_BUFFER = 255; const int MAX_BUFFER = 255;
char serialBuffer[MAX_BUFFER]; char serialBuffer[MAX_BUFFER];
int serialBufferPos = 0; int serialBufferPos = 0;
@ -34,6 +33,10 @@ const int GRAVITY_SAMPLES = 200; // Use the first samples to
const bool USING_INVENSENSE_MPU9150 = 1; const bool USING_INVENSENSE_MPU9150 = 1;
SerialInterface::~SerialInterface() {
close(_serialDescriptor);
}
void SerialInterface::pair() { void SerialInterface::pair() {
#ifdef __APPLE__ #ifdef __APPLE__
@ -65,18 +68,19 @@ void SerialInterface::pair() {
} }
// connect to the serial port // connect to the serial port
int SerialInterface::initializePort(char* portname, int baud) { void SerialInterface::initializePort(char* portname, int baud) {
#ifdef __APPLE__ #ifdef __APPLE__
serialFd = open(portname, O_RDWR | O_NOCTTY | O_NDELAY); _serialDescriptor = open(portname, O_RDWR | O_NOCTTY | O_NDELAY);
printLog("Opening SerialUSB %s: ", portname); printLog("Opening SerialUSB %s: ", portname);
if (serialFd == -1) { if (_serialDescriptor == -1) {
printLog("Failed.\n"); printLog("Failed.\n");
return -1; // Failed to open port _failedOpenAttempts++;
return;
} }
struct termios options; struct termios options;
tcgetattr(serialFd,&options); tcgetattr(_serialDescriptor, &options);
switch(baud) { switch(baud) {
case 9600: cfsetispeed(&options,B9600); case 9600: cfsetispeed(&options,B9600);
@ -101,26 +105,26 @@ int SerialInterface::initializePort(char* portname, int baud) {
options.c_cflag &= ~CSTOPB; options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE; options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8; options.c_cflag |= CS8;
tcsetattr(serialFd,TCSANOW,&options); tcsetattr(_serialDescriptor, TCSANOW, &options);
if (USING_INVENSENSE_MPU9150) { if (USING_INVENSENSE_MPU9150) {
// block on invensense reads until there is data to read // block on invensense reads until there is data to read
int currentFlags = fcntl(serialFd, F_GETFL); int currentFlags = fcntl(_serialDescriptor, F_GETFL);
fcntl(serialFd, F_SETFL, currentFlags & ~O_NONBLOCK); fcntl(_serialDescriptor, F_SETFL, currentFlags & ~O_NONBLOCK);
// there are extra commands to send to the invensense when it fires up // there are extra commands to send to the invensense when it fires up
// this takes it out of SLEEP // this takes it out of SLEEP
write(serialFd, "WR686B01\n", 9); write(_serialDescriptor, "WR686B01\n", 9);
// delay after the wakeup // delay after the wakeup
usleep(10000); usleep(10000);
// this disables streaming so there's no garbage data on reads // this disables streaming so there's no garbage data on reads
write(serialFd, "SD\n", 3); write(_serialDescriptor, "SD\n", 3);
// flush whatever was produced by the last two commands // flush whatever was produced by the last two commands
tcflush(serialFd, TCIOFLUSH); tcflush(_serialDescriptor, TCIOFLUSH);
} }
printLog("Connected.\n"); printLog("Connected.\n");
@ -128,8 +132,6 @@ int SerialInterface::initializePort(char* portname, int baud) {
active = true; active = true;
#endif #endif
return 0;
} }
// Reset Trailing averages to the current measurement // Reset Trailing averages to the current measurement
@ -143,9 +145,7 @@ void SerialInterface::renderLevels(int width, int height) {
int disp_x = 10; int disp_x = 10;
const int GAP = 16; const int GAP = 16;
char val[10]; char val[10];
for(i = 0; i < NUM_CHANNELS; i++) for(i = 0; i < NUM_CHANNELS; i++) {
{
// Actual value // Actual value
glLineWidth(2.0); glLineWidth(2.0);
glColor4f(1, 1, 1, 1); glColor4f(1, 1, 1, 1);
@ -202,8 +202,8 @@ void SerialInterface::readData() {
unsigned char gyroBuffer[20]; unsigned char gyroBuffer[20];
// ask the invensense for raw gyro data // ask the invensense for raw gyro data
write(serialFd, "RD684306\n", 9); write(_serialDescriptor, "RD684306\n", 9);
read(serialFd, gyroBuffer, 20); read(_serialDescriptor, gyroBuffer, 20);
convertHexToInt(gyroBuffer + 6, _lastYaw); convertHexToInt(gyroBuffer + 6, _lastYaw);
convertHexToInt(gyroBuffer + 10, _lastRoll); convertHexToInt(gyroBuffer + 10, _lastRoll);
@ -216,7 +216,7 @@ void SerialInterface::readData() {
const float AVG_RATE[] = {0.002, 0.002, 0.002, 0.002, 0.002, 0.002}; const float AVG_RATE[] = {0.002, 0.002, 0.002, 0.002, 0.002, 0.002};
char bufchar[1]; char bufchar[1];
while (read(serialFd, &bufchar, 1) > 0) { while (read(_serialDescriptor, &bufchar, 1) > 0) {
serialBuffer[serialBufferPos] = bufchar[0]; serialBuffer[serialBufferPos] = bufchar[0];
serialBufferPos++; serialBufferPos++;
// Have we reached end of a line of input? // Have we reached end of a line of input?

View file

@ -36,7 +36,11 @@ extern const bool USING_INVENSENSE_MPU9150;
class SerialInterface { class SerialInterface {
public: public:
SerialInterface() { active = false; };
SerialInterface() : active(false),
_failedOpenAttempts(0) {}
~SerialInterface();
void pair(); void pair();
void readData(); void readData();
@ -56,8 +60,10 @@ public:
glm::vec3 getGravity() {return gravity;}; glm::vec3 getGravity() {return gravity;};
private: private:
int initializePort(char * portname, int baud); void initializePort(char* portname, int baud);
void resetSerial(); void resetSerial();
int _serialDescriptor;
int lastMeasured[NUM_CHANNELS]; int lastMeasured[NUM_CHANNELS];
float trailingAverage[NUM_CHANNELS]; float trailingAverage[NUM_CHANNELS];
int samplesAveraged; int samplesAveraged;
@ -68,6 +74,7 @@ private:
int _lastYaw; int _lastYaw;
int _lastPitch; int _lastPitch;
int _lastRoll; int _lastRoll;
int _failedOpenAttempts;
}; };
#endif #endif