void TransferQueue::initGLResources(int width, int height) { android::Mutex::Autolock lock(m_transferQueueItemLocks); if (!m_sharedSurfaceTextureId) { glGenTextures(1, &m_sharedSurfaceTextureId); sp<BufferQueue> bufferQueue(new BufferQueue(true)); m_sharedSurfaceTexture = #if GPU_UPLOAD_WITHOUT_DRAW new android::SurfaceTexture(m_sharedSurfaceTextureId, true, GL_TEXTURE_2D, true, bufferQueue); #else new android::SurfaceTexture(m_sharedSurfaceTextureId, true, GL_TEXTURE_EXTERNAL_OES, true, bufferQueue); #endif m_ANW = new android::SurfaceTextureClient(m_sharedSurfaceTexture); m_sharedSurfaceTexture->setSynchronousMode(true); int extraBuffersNeeded = 0; m_ANW->query(m_ANW.get(), NATIVE_WINDOW_MIN_UNDEQUEUED_BUFFERS, &extraBuffersNeeded); bufferQueue->setBufferCount(m_transferQueueSize + extraBuffersNeeded); int result = native_window_set_buffers_geometry(m_ANW.get(), width, height, HAL_PIXEL_FORMAT_RGBA_8888); GLUtils::checkSurfaceTextureError("native_window_set_buffers_geometry", result); result = native_window_set_usage(m_ANW.get(), GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN); GLUtils::checkSurfaceTextureError("native_window_set_usage", result); } if (!m_fboID) glGenFramebuffers(1, &m_fboID); }
static void handler(unsigned char c, void* device){ GPS_NMEA* gps = (GPS_NMEA*)device; // Get working data int msgIndex = gps->msgIndex; boolean error = gps->error; char* msg = gps->msg; // If its a $ then its the start of a msg if(c=='$'){ msgIndex = 0; // reset the msg buffer error=FALSE; // clear error state } // Store the character if(msgIndex < MAX_NMEA_MSG-1){ msg[msgIndex++] = c; // store character msg[msgIndex] = 0; // null terminate string }else{ error=TRUE; // the message is too long } // Test for end of line if(c=='\n' && error==FALSE){ // Have got a line of length msgIndex // Test for minimum size of '$GP...<,>.....*xx<cr><lf>' if(msgIndex >= 8){ if(msg[0]=='$' && msg[1]=='G' && msg[2]=='P' && msg[6]==',' && msg[msgIndex-1]=='\n' && msg[msgIndex-2]=='\r' && msg[msgIndex-5]=='*'){ uint8_t myChecksum=0; uint8_t i; // Looks like a valid message msg[msgIndex-2]=0; // chop off cr/lf msgIndex=0; // We only use GPRMC and GPGGA if( msg[3]=='R' && msg[4]=='M' && msg[5]=='C') goto ok; if( msg[3]=='G' && msg[4]=='G' && msg[5]=='A') goto ok; goto end; // Calculate the checksum ok: for(i=1; ;){ c = msg[i++]; // Shouldn't happen - but check for end of string if(c=='\0'){ goto end; } if(c=='*'){ break; } myChecksum ^= c; } // Remove checksum msg[i-1]=0; // String length including terminator size_t msgLen = i; if(bufferFreeSpace(&gps->msgQueueBuf) < msgLen){ // not enough space in buffer goto end; } // Get received checksum uint8_t rxChecksum=0; c = msg[i++]; if(c>='0' && c<='9'){ rxChecksum += c-'0'; }else{ rxChecksum += c-'A'+10; } rxChecksum *= 16; c = msg[i++]; if(c>='0' && c<='9'){ rxChecksum += c-'0'; }else{ rxChecksum += c-'A'+10; } // If checksums agree then add message to queue if(rxChecksum==myChecksum){ if( ! bufferQueue(&gps->msgQueueBuf, msg, msgLen) ){ goto end; // couldn't add it for some reason } }else{ #ifdef DEBUG PRINTF(stdout,"Bad checksum:"); #endif } } } } end: // Set working data gps->msgIndex = msgIndex; gps->error = error; }