Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- RingBufferDef *inBuf = RINGS_createRingBuffer(65000, RINGS_OVERFLOW_SHIFT, true);
- uint64_t prbits = EXB_PREAMBLE_R;
- uint8_t mode = MODE_PREAMBLE;
- ExbPacket *packet = NULL;
- uint16_t sbody = 0;
- while(1) {
- char ch;
- ssize_t r = read(fd, &ch, 1);
- if (r > 0) { // if some char was received
- fflush(stdout);
- RINGS_write((uint8_t) ch, inBuf);
- uint16_t dlen = RINGS_dataLenght(inBuf);
- if (mode == MODE_PREAMBLE) { // If expected preamble form stream
- if (dlen >= EXB_PREAMBLE_SIZE) { //If the buffer contain data with size of preamble or more
- int r = RINGS_cmpData(dlen - EXB_PREAMBLE_SIZE, (uint8_t*) &prbits, EXB_PREAMBLE_SIZE, inBuf);
- if (r == 0) {
- RINGS_dataClear(inBuf);
- mode = MODE_HEADER;
- }
- }
- } else if (mode == MODE_HEADER) {
- if (dlen >= EXB_HEADER_SIZE ) {
- uint8_t *header = (uint8_t*) malloc(EXB_HEADER_SIZE);
- packet = (ExbPacket*) malloc(sizeof(ExbPacket));
- RINGS_extractData(inBuf->reader, EXB_HEADER_SIZE, header, inBuf);
- ExbPacket_parsePacketHeader(packet, header, 0);
- sbody = packet->length;
- RINGS_dataClear(inBuf);
- mode = MODE_BODY;
- free(header);
- }
- } else {
- if (dlen >= sbody + EXB_HEADER_SIZE) {
- uint8_t *blobs = (uint8_t*) malloc(sbody + EXB_HEADER_SIZE);
- uint8_t *blob = (uint8_t*) malloc(sbody + EXB_HEADER_SIZE + EXB_PREAMBLE_SIZE);
- RINGS_readAll(blobs, inBuf);
- memcpy(blob + 8, blobs, sbody + EXB_HEADER_SIZE);
- memcpy(blob, &prbits, 8);
- int stotal = sbody + EXB_HEADER_SIZE + EXB_PREAMBLE_SIZE;
- jbyteArray ret = env->NewByteArray(stotal);
- env->SetByteArrayRegion(ret, 0, stotal, (jbyte*) blob);
- free(blob);
- free(blobs);
- free(packet);
- RINGS_Free(inBuf);
- free(inBuf);
- return ret;
- //mode = MODE_PREAMBLE;
- }
- }
- } else {
- jbyteArray ret = env->NewByteArray(0);
- return ret;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement