Subversion Repositories FlightCtrl

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

void SendOutData(uint8_t cmd, uint8_t addr, uint8_t numofbuffers, ...) { // uint8_t *pdata, uint8_t len, ...
  va_list ap;
  uint16_t txd_bufferIndex = 0;
  uint8_t *currentBuffer;
  uint8_t currentBufferIndex;
  uint16_t lengthOfCurrentBuffer;
  uint8_t shift = 0;
 
  txd_buffer[txd_bufferIndex++] = '#';                  // Start character
  txd_buffer[txd_bufferIndex++] = 'a' + addr;           // Address (a=0; b=1,...)
  txd_buffer[txd_bufferIndex++] = cmd;                  // Command
 
  va_start(ap, numofbuffers);

  while(numofbuffers) {
    currentBuffer = va_arg(ap, uint8_t*);
    lengthOfCurrentBuffer = va_arg(ap, int);
    currentBufferIndex = 0;
    // Encode data: 3 bytes of data are encoded into 4 bytes,
    // where the 2 most significant bits are both 0.
    while(currentBufferIndex != lengthOfCurrentBuffer) {
      if (!shift) txd_buffer[txd_bufferIndex] = 0;
      txd_buffer[txd_bufferIndex]  |= currentBuffer[currentBufferIndex] >> (shift + 2);
      txd_buffer[++txd_bufferIndex] = (currentBuffer[currentBufferIndex] << (4 - shift)) & 0b00111111;
      shift += 2;
      if (shift == 6) { shift=0; txd_bufferIndex++; }
      currentBufferIndex++;
    }
  }
  // If the number of data bytes was not divisible by 3, stuff
  //  with 0 pseudodata  until length is again divisible by 3.
  if (shift == 2) {
    // We need to stuff with zero bytes at the end.
    txd_buffer[txd_bufferIndex]  &= 0b00110000;
    txd_buffer[++txd_bufferIndex] = 0;
    shift = 4;
  }
  if (shift == 4) {
    // We need to stuff with zero bytes at the end.
    txd_buffer[txd_bufferIndex++] &= 0b00111100;
    txd_buffer[txd_bufferIndex]    = 0;
  }
  va_end(ap);
  AddCRC(pt); // add checksum after data block and initates the transmission
}