Пример #1
0
uint8_t GPS_MTK3339::parseSentence(){
    GPS_DEBUG_READ_PRINTLN("PARSING");
    
    _machineState = GPS_MS_READY;
    
    #ifdef GPS_DEBUG_READ_PRINT_BUFFER
        GPS_DEBUG_READ_PRINTLN((char *)Buffer);
    #endif
    
    uint8_t sentenceName = getsentenceName();
    uint8_t startByte = 0;
    uint8_t stopByte = startByte;
    uint8_t element = 0;
    bool elementParseSuccess = false;
    
    for(uint8_t i = 0; i < sizeof(Buffer); i++){
        uint8_t b = Buffer[i];
        
        // ',' or '*'
        if(b == GPS_ELEMENT_DELIM || b == GPS_CHKSUM_DELIM){
            switch(sentenceName){
                case GPS_STATUS_SUCCESS_RMC:
                    elementParseSuccess = parseRmc(element, startByte, stopByte);
                    break;
                case GPS_STATUS_SUCCESS_GGA:
                    elementParseSuccess = parseGga(element, startByte, stopByte);
                    break;
                default:
                    elementParseSuccess = true;
                    break;
            }
            if(elementParseSuccess == false){
                GPS_DEBUG_READ_PRINTLN("element parse error");
                _machineState = GPS_MS_ERROR;
                return GPS_ERROR_PARSE_ERR;
            }
            if(b == GPS_CHKSUM_DELIM){
                if(verifyChecksum(i)){ 
                    loadValues();
                    return sentenceName; 
                }
                
                GPS_DEBUG_READ_PRINTLN("invalid checksum");
                _machineState = GPS_MS_ERROR;
                return GPS_ERROR_CHECKSUM;
            }
            startByte = i + 1;
            stopByte = startByte;
            element++;
        }
        else{
            stopByte++;
        }
    }
    
    GPS_DEBUG_READ_PRINTLN("unexpected end of parse");
    _machineState = GPS_MS_ERROR;
    return GPS_ERROR_PARSE_ERR;
}
Пример #2
0
/*!
 * \brief Unpack pressure sensor samples from realtime data.
 *
 * \return True, if there are no problems, false if there is something wrong with the data. 
 */
bool WG06::unpackPressure(unsigned char *pressure_buf)
{  
  if (!enable_pressure_sensor_)
  {
    // If pressure sensor is not enabled don't attempt to do anything with pressure data
    return true;
  }

  if (!verifyChecksum(pressure_buf, pressure_size_))
  {
    ++pressure_checksum_error_count_;
    if (false /* debugging */)
    {
      std::stringstream ss;
      ss << "Pressure buffer checksum error : " << std::endl;
      for (unsigned ii=0; ii<pressure_size_; ++ii)
      {
        ss << std::uppercase << std::hex << std::setw(2) << std::setfill('0')
           << unsigned(pressure_buf[ii]) << " ";
        if ((ii%8) == 7) ss << std::endl;
      }
      ROS_ERROR_STREAM(ss.str());
      std::cerr << ss.str() << std::endl;
    }
    pressure_checksum_error_ = true;
    return false;
  }
  else 
  {
    WG06Pressure *p( (WG06Pressure *) pressure_buf);
    for (int i = 0; i < 22; ++i ) {
      pressure_sensors_[0].state_.data_[i] =
        ((p->l_finger_tip_[i] >> 8) & 0xff) |
        ((p->l_finger_tip_[i] << 8) & 0xff00);
      pressure_sensors_[1].state_.data_[i] =
        ((p->r_finger_tip_[i] >> 8) & 0xff) |
        ((p->r_finger_tip_[i] << 8) & 0xff00);
    }

    if (p->timestamp_ != last_pressure_time_)
    {
      if (pressure_publisher_ && pressure_publisher_->trylock())
      {
        pressure_publisher_->msg_.header.stamp = ros::Time::now();
        pressure_publisher_->msg_.l_finger_tip.resize(22);
        pressure_publisher_->msg_.r_finger_tip.resize(22);
        for (int i = 0; i < 22; ++i ) {
          pressure_publisher_->msg_.l_finger_tip[i] = pressure_sensors_[0].state_.data_[i];
          pressure_publisher_->msg_.r_finger_tip[i] = pressure_sensors_[1].state_.data_[i];
        }
        pressure_publisher_->unlockAndPublish();
      }
    }
    last_pressure_time_ = p->timestamp_;
  }

  return true;
}
Пример #3
0
bool WG06::unpackState(unsigned char *this_buffer, unsigned char *prev_buffer)
{
  bool rv = true;

  int status_bytes = 
    has_accel_and_ft_  ? sizeof(WG06StatusWithAccelAndFT) :  // Has FT sensor and accelerometer
    accel_publisher_   ? sizeof(WG06StatusWithAccel) : 
                         sizeof(WG0XStatus);  

  unsigned char *pressure_buf = (this_buffer + command_size_ + status_bytes);

  unsigned char* this_status = this_buffer + command_size_;
  if (!verifyChecksum(this_status, status_bytes))
  {
    status_checksum_error_ = true;
    rv = false;
    goto end;
  }

  if (!unpackPressure(pressure_buf))
  {
    rv = false;
    //goto end;  // all other tasks should not be effected by bad pressure sensor data
  }

  if (accel_publisher_)
  {
    WG06StatusWithAccel *status = (WG06StatusWithAccel *)(this_buffer + command_size_);
    WG06StatusWithAccel *last_status = (WG06StatusWithAccel *)(prev_buffer + command_size_);
    if (!unpackAccel(status, last_status))
    {
      rv=false;
    }
  }

  if (has_accel_and_ft_ && enable_ft_sensor_)
  {
    WG06StatusWithAccelAndFT *status = (WG06StatusWithAccelAndFT *)(this_buffer + command_size_);
    WG06StatusWithAccelAndFT *last_status = (WG06StatusWithAccelAndFT *)(prev_buffer + command_size_);
    if (!unpackFT(status, last_status))
    {
      rv = false;
    }
  }


  if (!WG0X::unpackState(this_buffer, prev_buffer))
  {
    rv = false;
  }

 end:
  return rv;
}
Пример #4
0
void RemoteBlockReader::readNextPacket() {
    assert(position >= size);
    lastHeader = readPacketHeader();
    int dataSize = lastHeader->getDataLen();
    int64_t pendingAhead = 0;

    if (!lastHeader->sanityCheck(lastSeqNo)) {
        THROW(HdfsIOException, "RemoteBlockReader: Packet failed on sanity check for block %s from Datanode %s.",
              binfo.toString().c_str(), datanode.formatAddress().c_str());
    }

    assert(dataSize > 0 || lastHeader->getPacketLen() == sizeof(int32_t));

    if (dataSize > 0) {
        int chunks = (dataSize + chunkSize - 1) / chunkSize;
        int checksumLen = chunks * checksumSize;
        size = checksumLen + dataSize;
        assert(size == lastHeader->getPacketLen() - static_cast<int>(sizeof(int32_t)));
        buffer.resize(size);
        in->readFully(&buffer[0], size, readTimeout);
        lastSeqNo = lastHeader->getSeqno();

        if (lastHeader->getPacketLen() != static_cast<int>(sizeof(int32_t)) + dataSize + checksumLen) {
            THROW(HdfsIOException, "Invalid Packet, packetLen is %d, dataSize is %d, checksum size is %d",
                  lastHeader->getPacketLen(), dataSize, checksumLen);
        }

        if (verify) {
            verifyChecksum(chunks);
        }

        /*
         * skip checksum
         */
        position = checksumLen;
        /*
         * the first packet we get may start at the position before we required
         */
        pendingAhead = cursor - lastHeader->getOffsetInBlock();
        pendingAhead = pendingAhead > 0 ? pendingAhead : 0;
        position += pendingAhead;
    }

    /*
     * we reach the end of the range we required, send status to datanode
     * if datanode do not sending data anymore.
     */

    if (cursor + dataSize - pendingAhead >= endOffset && readTrailingEmptyPacket()) {
        sendStatus();
    }
}
Пример #5
0
bool WG021::unpackState(unsigned char *this_buffer, unsigned char *prev_buffer)
{
  bool rv = true;

  pr2_hardware_interface::ProjectorState &state = projector_.state_;
  WG021Status *this_status, *prev_status;
  this_status = (WG021Status *)(this_buffer + command_size_);
  prev_status = (WG021Status *)(prev_buffer + command_size_);
  
  if (!verifyChecksum(this_status, status_size_))
  {
    status_checksum_error_ = true;
    rv = false;
    goto end;
  }

  digital_out_.state_.data_ = this_status->digital_out_;

  state.timestamp_us_ = this_status->timestamp_;
  state.falling_timestamp_us_ = this_status->output_stop_timestamp_;
  state.rising_timestamp_us_ = this_status->output_start_timestamp_;

  state.output_ = (this_status->output_status_ & 0x1) == 0x1;
  state.falling_timestamp_valid_ = (this_status->output_status_ & 0x8) == 0x8;
  state.rising_timestamp_valid_ = (this_status->output_status_ & 0x4) == 0x4;

  state.A_ = ((this_status->config0_ >> 4) & 0xf);
  state.B_ = ((this_status->config0_ >> 0) & 0xf);
  state.I_ = ((this_status->config1_ >> 4) & 0xf);
  state.M_ = ((this_status->config1_ >> 0) & 0xf);
  state.L1_ = ((this_status->config2_ >> 4) & 0xf);
  state.L0_ = ((this_status->config2_ >> 0) & 0xf);
  state.pulse_replicator_ = (this_status->general_config_ & 0x1) == 0x1;

  state.last_executed_current_ = this_status->programmed_current_ * config_info_.nominal_current_scale_;
  state.last_measured_current_ = this_status->measured_current_ * config_info_.nominal_current_scale_;

  state.max_current_ = max_current_;

  max_board_temperature_ = max(max_board_temperature_, this_status->board_temperature_);
  max_bridge_temperature_ = max(max_bridge_temperature_, this_status->bridge_temperature_);

  if (!verifyState((WG0XStatus *)(this_buffer + command_size_), (WG0XStatus *)(prev_buffer + command_size_)))
  {
    rv = false;
  }

end:
  return rv;
}
Пример #6
0
uint8_t getData(dht11Data_t* recvData) {
	DHTPOUT &= ~DHTPIN;

	initGlobals();
	// Config Timer
	TB0CCTL0 = CCIE;                         	// TRCCR0 interrupt enabled
	TB0CCR0 = 54000;							// 18ms @ 3MHz
	TB0CTL = TBSSEL_2 | ID_2 | MC_1 | TBCLR;	// SMCLK/4 = 3MHz, upmode, clear TBR
	DHTPDIR |= DHTPIN;							// set to output

	__bis_SR_register(LPM0_bits + GIE);

	recvData->rawData = receivedData;

	return verifyChecksum(recvData); 			// data is only valid if checkSum is OK
}
Пример #7
0
bool pAnswer::setDatagram(char* _data, int _len)
{
    if(!verifyChecksum(_data))
	return false;

    id = _data[2];
    sid = *(ushort*)(_data + 15);

    datetime.setDate(sdt.inttodate(get_date(_data)));
    datetime.setTime(sdt.inttotime(get_time(_data)));
    
    int size = get_size(_data);
    
    pVariable tvar;
    int cur_ptr = 17, len = 0;
    
    for(; size > 0; size -= len) {
	tvar.setStr(_data + cur_ptr, &len);
	cur_ptr += len;
	addVariable(tvar);
    }
    
    return true;
}
Пример #8
0
Error QTar::extract()
{
	//ifstream ofstream to seekg()
	QArchive::extract();

	if(!exists()) return Archive::OpenError;
	char buff[Header::RecordSize];
	//QFile outFile;
	//FILE* f;
	size_t bytes_read;
	unsigned int filesize;

#if ARCREADER_QT4
	if(!open(QIODevice::ReadOnly)) {
		error();
#else
	if(open(IO_ReadOnly)) {
		qDebug("open error");
#endif //ARCREADER_QT4
		return Archive::OpenError;
	}
	Q_D(QArchive);
	for (;;) {
#if ARCREADER_QT4
		bytes_read = read(buff,Header::RecordSize);
#else
		bytes_read = readBlock(buff,Header::RecordSize);
#endif //ARCREADER_QT4
		//put them here
		emit byteProcessed(d->processedSize+=Header::RecordSize);
		d->current_fileName=QFileInfo(buff).fileName();

		if (bytes_read < Header::RecordSize) {
			fprintf(stderr,"Short read. expected 512, got %d\n", bytes_read);
			return Archive::ReadError;
		}
		if (isEndBuff(buff)) {
#if USE_SLOT
			emit byteProcessed(d->processedSize+=Header::RecordSize);  //header;
#else
			estimate();
			progressHandler->Progress(d->current_fileName, d->size, d->processedSize+=Header::RecordSize, d->totalSize, d->speed, d->elapsed, d->left);
#endif
			finishMessage();
			return End;
		}
		if (!verifyChecksum(buff)) {
			fprintf(stderr, "Checksum failure\n");
			return ChecksumError;
		}

		switch (buff[156]) {
		case Header::LinkFlag::kLink :			printf(" Ignoring hardlink %s\n", buff); break;
		case Header::LinkFlag::kSymbolicLink :	printf(" Ignoring symlink %s\n", buff); break; /////////////////////////
		case Header::LinkFlag::kCharacter:		printf(" Ignoring character device %s\n", buff); break;
		case Header::LinkFlag::kBlock:			printf(" Ignoring block device %s\n", buff); break;
		case Header::LinkFlag::kDirectory:
			createDir(QString::fromLocal8Bit(buff), parseOct(buff + 100, 8));
			filesize = 0;
			break;
		case Header::LinkFlag::kFIFO:			printf(" Ignoring FIFO %s\n", buff); break;
		default:
			createFile(QString::fromLocal8Bit(buff), parseOct(buff + 100, 8));
			break;
		}

		++d->numFiles;
		filesize = parseOct(buff + 124, 12);
		d->size = filesize;
#if USE_SLOT
		updateMessage();
#endif
		while (filesize > 0) {
			checkTryPause();
#if ARCREADER_QT4
			bytes_read = read(buff,Header::RecordSize);
#else
			bytes_read = readBlock(buff,Header::RecordSize);
#endif //ARCREADER_QT4
			if (bytes_read < Header::RecordSize) {
				fprintf(stderr,"Short read. Expected 512, got %d\n",bytes_read);
				return Archive::ReadError;
			}
			if (filesize < Header::RecordSize) bytes_read = filesize;
			if (d->outFile.isOpen()) {
#if CONFIG_QT4
				if(d->outFile.write(buff,bytes_read)!=bytes_read) {
					fprintf(stderr, "[%s] %s @%d: Failed to write %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,qPrintable(d->outFile.fileName()));
#else
				if(d->outFile.writeBlock(buff,bytes_read)!=bytes_read) {
					fprintf(stderr, "[%s] %s @%d: Failed to write %s\n",__FILE__,__PRETTY_FUNCTION__,__LINE__,qPrintable(d->outFile.name()));
#endif
					d->outFile.close();
				}
				/*if (fwrite(buff, 1, bytes_read, f)!= bytes_read) {
					fprintf(stderr, "Failed write\n");
					fclose(f);
					f = NULL;
				}*/
			}
#if USE_SLOT
			forceShowMessage(1000);
			emit byteProcessed(d->processedSize+=Header::RecordSize);//bytes_read);
#else
			estimate();
			progressHandler->Progress(d->current_fileName, d->size, d->processedSize+=Header::RecordSize, d->totalSize, d->speed, d->elapsed, d->left);
#endif
			filesize -= bytes_read;
		}
		//emit byteProcessed(processedSize+=size);
		if(d->outFile.isOpen()) d->outFile.close();
	}
	close();
}

Archive::Error QTar::extract(const QString& archive,const QString& dir)
{
	setArchive(archive);
	setOutDir(dir);

	return extract();
}
Пример #9
0
bool TeleClientUDP::notify(byte event, const char* payload)
{
  char buf[48];
  CStorageRAM netbuf;
  netbuf.init(128);
  netbuf.header(devid);
  byte len = sprintf(buf, "EV=%X", (unsigned int)event);
  netbuf.dispatch(buf, len);
  len = sprintf(buf, "TS=%lu", millis());
  netbuf.dispatch(buf, len);
  len = sprintf(buf, "ID=%s", devid);
  netbuf.dispatch(buf, len);
  if (vin[0]) {
    len = sprintf(buf, "VIN=%s", vin);
    netbuf.dispatch(buf, len);
  }
  if (payload) {
    netbuf.dispatch(payload, strlen(payload));
  }
  netbuf.tailer();
  //Serial.println(netbuf.buffer());
  for (byte attempts = 0; attempts < 3; attempts++) {
    // send notification datagram
    //Serial.println(netbuf.buffer());
    if (!net.send(netbuf.buffer(), netbuf.length())) {
      // error sending data
      break;
    }
    if (event == EVENT_ACK) return true; // no reply for ACK
    char *data = 0;
    // receive reply
    uint32_t t = millis();
    do {
      if ((data = net.receive())) break;
      // no reply yet
      delay(100);
    } while (millis() - t < DATA_RECEIVING_TIMEOUT);
    if (!data) {
      //Serial.println("Timeout");
      continue;
    }
    // verify checksum
    if (!verifyChecksum(data)) {
      Serial.print("Checksum mismatch:");
      Serial.println(data);
      continue;
    }
    char pattern[16];
    sprintf(pattern, "EV=%u", event);
    if (!strstr(data, pattern)) {
      Serial.println("Invalid reply");
      continue;
    }
    if (event == EVENT_LOGIN) {
      // extract info from server response
      char *p = strstr(data, "TM=");
      if (p) {
        // set local time from server
        unsigned long tm = atol(p + 3);
        struct timeval tv = { .tv_sec = (time_t)tm, .tv_usec = 0 };
        settimeofday(&tv, NULL);
      }
      p = strstr(data, "SN=");
      if (p) {
        char *q = strchr(p, ',');
        if (q) *q = 0;
      }
      feedid = hex2uint16(data);
      login = true;
    } else if (event == EVENT_LOGOUT) {
      login = false;
    }
    // success
    return true;
  }
Пример #10
0
void
rel_recvpkt (rel_t *r, packet_t *pkt, size_t n)
{
  // printf("rel_recvpkt\n");

  uint16_t len = ntohs(pkt->len);
  uint32_t ackno = ntohl(pkt->ackno);

  int verified = verifyChecksum(r, pkt, n);
  if (!verified || (len != n)) { // Drop packets with bad length
    // fprintf(stderr, "Packet w/ sequence number %d dropped\n", ntohl(pkt->seqno));
    return;
  }

  if (len == ACK_PACKET_SIZE) { // Received packet is an ack packet
    // fprintf(stderr, "Received ack number: %d\n", ackno);
    // fprintf(stderr, "%s\n", "======================RECEIVED ACK  PACKET=========================");
    if (ackno <= r->LAST_PACKET_ACKED + 1) { // Drop duplicate acks
      // fprintf(stderr, "Duplicate ack: %d received\n", ackno);
      return;
    }

    if (ackno == r->LAST_ACK_RECVD) {
      r->LAST_ACK_COUNT++;
    }
    else {
      r->LAST_ACK_RECVD = ackno;
      r->LAST_ACK_COUNT = 1;
    }

    if (r->slowStart) {
      // fprintf(stderr, "window size: %d\n", r->windowSize);
      if (r->windowSize * 2 > r->ssThresh) {
        // START AIMD
        // return;
      } else {
        r->windowSize = r->windowSize * 2;
      }
      // fprintf(stderr, "success? %d\n", r->windowSize);
    } 
    else {
      if (r->windowSize + 1 == r->ssThresh) {

      } else {
        r->windowSize = r->windowSize + 1;
      }
    }

    shiftSentPacketList(r, ackno);

    r->LAST_PACKET_ACKED = ackno - 1;

    rel_read(r);
  }
  else { // data packet
    // fprintf(stderr, "%s\n", "======================RECEIVED DATA PACKET=========================");
    uint32_t seqno = ntohl(pkt->seqno);

    // fprintf(stderr, "Received Data: %s\n", pkt->data);

    // fprintf(stderr, "Received data: %s\n", pkt->data);


    // if (seqno > r->NEXT_PACKET_EXPECTED) {
    //   // Ghetto fix
    //   return;
    // }

    if (seqno < r->NEXT_PACKET_EXPECTED) { // duplicate packet
      // fprintf(stderr, "Received duplicate packet w/ sequence number: %d\n", seqno);
      struct ack_packet *ack = createAckPacket(r, r->NEXT_PACKET_EXPECTED);
      conn_sendpkt(r->c, (packet_t *)ack, ACK_PACKET_SIZE);
      free(ack);
      return;
    }

    if (seqno - r->NEXT_PACKET_EXPECTED > r->windowSize) {  // Packet outside window
      return;
    }

    // fprintf(stderr, "Received sequence number: %d\n", seqno);

    int slot = seqno - r->NEXT_PACKET_EXPECTED;
    // fprintf(stderr, "RecvPacket slot number: %d\n", slot);
    memcpy(r->recvPackets[slot]->packet, pkt, sizeof(packet_t));
    r->recvPackets[slot]->sentTime = getCurrentTime();
    r->recvPackets[slot]->acked = 1;

    rel_output(r);

    // if (seqno == r->NEXT_PACKET_EXPECTED) {
    //   struct ack_packet *ack = createAckPacket(r, r->NEXT_PACKET_EXPECTED + 1);

    //   conn_sendpkt(r->c, (packet_t *)ack, ACK_PACKET_SIZE);
    //   conn_output(r->c, pkt->data, len - HEADER_SIZE);
    //   // rel_output(r);
    //   r->NEXT_PACKET_EXPECTED++;
    //   free(ack);
    // }

  }
}
Пример #11
0
void
rel_recvpkt (rel_t *r, packet_t *pkt, size_t n)
{
  uint16_t len = ntohs(pkt->len);
  uint32_t ackno = ntohl(pkt->ackno);

  int verified = verifyChecksum(r, pkt, n);
  if (!verified || (len != n)) { // Drop packets with bad length
    fprintf(stderr, "Packet w/ sequence number %d dropped\n", ntohl(pkt->seqno));
    return;
  }

  if (len == ACK_PACKET_SIZE) { // Received packet is an ack packet
    fprintf(stderr, "Received ack number: %d\n", ackno);
    if (ackno <= r->LAST_PACKET_ACKED + 1) { // Drop duplicate acks
      fprintf(stderr, "Duplicate ack: %d received\n", ackno);
      return;
    }

    //if (ackno == r->LAST_PACKET_SENT + 1) { // REMOVE THIS AFTER WE FIX ACK SENDING!!!!
      shiftSentPacketList(r, ackno);

      r->LAST_PACKET_ACKED = ackno - 1;

      rel_read(r);
    //}
  }
  else { // data packet
    fprintf(stderr, "%s\n", "======================RECEIVED DATA PACKET=========================");
    uint32_t seqno = ntohl(pkt->seqno);

    // fprintf(stderr, "Received data: %s\n", pkt->data);


    // if (seqno > r->NEXT_PACKET_EXPECTED) {
    //   // Ghetto fix
    //   return;
    // }

    if (seqno < r->NEXT_PACKET_EXPECTED) { // duplicate packet
      fprintf(stderr, "Received duplicate packet w/ sequence number: %d\n", seqno);
      struct ack_packet *ack = createAckPacket(r, r->NEXT_PACKET_EXPECTED);
      conn_sendpkt(r->c, (packet_t *)ack, ACK_PACKET_SIZE);
      free(ack);
      return;
    }

    if (seqno - r->NEXT_PACKET_EXPECTED > r->windowSize) {  // Packet outside window
      return;
    }

    fprintf(stderr, "Received sequence number: %d\n", seqno);

    int slot = seqno - r->NEXT_PACKET_EXPECTED;
    fprintf(stderr, "RecvPacket slot number: %d\n", slot);
    memcpy(r->recvPackets[slot]->packet, pkt, sizeof(packet_t));
    r->recvPackets[slot]->sentTime = getCurrentTime();
    r->recvPackets[slot]->acked = 1;

    rel_output(r);

    // if (seqno == r->NEXT_PACKET_EXPECTED) {
    //   struct ack_packet *ack = createAckPacket(r, r->NEXT_PACKET_EXPECTED + 1);

    //   conn_sendpkt(r->c, (packet_t *)ack, ACK_PACKET_SIZE);
    //   conn_output(r->c, pkt->data, len - HEADER_SIZE);
    //   // rel_output(r);
    //   r->NEXT_PACKET_EXPECTED++;
    //   free(ack);
    // }

  }
}