Advertisement
Guest User

Untitled

a guest
Jul 11th, 2019
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.46 KB | None | 0 0
  1.     RingBufferDef *inBuf  = RINGS_createRingBuffer(65000, RINGS_OVERFLOW_SHIFT, true);
  2.     uint64_t prbits = EXB_PREAMBLE_R;
  3.     uint8_t mode = MODE_PREAMBLE;
  4.     ExbPacket *packet = NULL;
  5.     uint16_t sbody = 0;
  6.  
  7.     while(1) {
  8.         char ch;
  9.  
  10.         ssize_t r = read(fd, &ch, 1);
  11.         if (r > 0) { // if some char was received
  12.             fflush(stdout);
  13.             RINGS_write((uint8_t) ch, inBuf);
  14.             uint16_t dlen = RINGS_dataLenght(inBuf);
  15.             if (mode == MODE_PREAMBLE) { // If expected preamble form stream
  16.                 if (dlen >= EXB_PREAMBLE_SIZE) { //If the buffer contain data with size of preamble or more
  17.                     int r = RINGS_cmpData(dlen - EXB_PREAMBLE_SIZE, (uint8_t*) &prbits, EXB_PREAMBLE_SIZE, inBuf);
  18.                     if (r == 0) {
  19.                         RINGS_dataClear(inBuf);
  20.                         mode = MODE_HEADER;
  21.                     }
  22.                 }
  23.             } else if (mode == MODE_HEADER) {
  24.                 if (dlen >= EXB_HEADER_SIZE ) {
  25.                     uint8_t *header = (uint8_t*) malloc(EXB_HEADER_SIZE);
  26.                     packet = (ExbPacket*) malloc(sizeof(ExbPacket));
  27.                     RINGS_extractData(inBuf->reader, EXB_HEADER_SIZE, header, inBuf);
  28.                     ExbPacket_parsePacketHeader(packet, header, 0);
  29.                     sbody = packet->length;
  30.                     RINGS_dataClear(inBuf);
  31.                     mode = MODE_BODY;
  32.                     free(header);
  33.                 }
  34.             } else {
  35.                 if (dlen >= sbody + EXB_HEADER_SIZE) {
  36.                     uint8_t *blobs = (uint8_t*) malloc(sbody + EXB_HEADER_SIZE);
  37.                     uint8_t *blob = (uint8_t*) malloc(sbody + EXB_HEADER_SIZE + EXB_PREAMBLE_SIZE);
  38.                     RINGS_readAll(blobs, inBuf);
  39.                     memcpy(blob + 8, blobs, sbody + EXB_HEADER_SIZE);
  40.                     memcpy(blob, &prbits, 8);
  41.  
  42.                     int stotal = sbody + EXB_HEADER_SIZE + EXB_PREAMBLE_SIZE;
  43.                     jbyteArray ret = env->NewByteArray(stotal);
  44.                     env->SetByteArrayRegion(ret, 0, stotal, (jbyte*) blob);
  45.  
  46.  
  47.                     free(blob);
  48.                     free(blobs);
  49.                     free(packet);
  50.                     RINGS_Free(inBuf);
  51.                     free(inBuf);
  52.  
  53.                     return ret;
  54.                     //mode = MODE_PREAMBLE;
  55.                 }
  56.             }
  57.         } else {
  58.             jbyteArray ret = env->NewByteArray(0);
  59.             return ret;
  60.         }
  61.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement