Beispiel #1
0
int collect_process(struct collect_state *cs, gnuplot_ctrl *bsln_disp[4], int *real_raw, int *imag_raw)
{
	struct header_poco *hp;
	struct option_poco *op;
	unsigned int options, base, payload, i;
	int wr, or, result;
	int j, k;
	unsigned int value, compare, flag;

	result = 0;
	compare = 0;

	if(cs->c_have < 8){
		fprintf(stderr, "process: short packet (len=%u)\n", cs->c_have);
		return -1;
	}

	hp = (struct header_poco *) cs->c_buffer;

	if(hp->h_magic != htons(MAGIC_HEADER_POCO)){
		fprintf(stderr, "process: bad header magic 0x%04x\n", hp->h_magic);
		cs->c_errors++;
		return -1;
	}


	if(hp->h_version != htons(VERSION_HEADER_POCO)){
		fprintf(stderr, "process: odd version %d\n", ntohs(hp->h_version));
		cs->c_errors++;
		return -1;
	}

	options = ntohs(hp->h_options);
	base = (options + 1) * 8;

	if(base > cs->c_have){
		fprintf(stderr, "process: options larger than packet itself\n");
		cs->c_errors++;
		return -1;
	}

	payload = cs->c_have - base;

	if(cs->c_meta){
		fprintf(cs->c_meta, "frame %lu: options %u, length %u, payload %u\n", cs->c_rxp, options, cs->c_have, payload);
	}

	for(i = 0; i < options; i++){
		op = (struct option_poco *)(cs->c_buffer + ((i + 1) * 8));
		or = option_process(cs, op);
		if(or){
			result = or;
		}
	}

	cs->c_rxopts += options;

	/* at this point we have the number of data bytes in payload, and the start of data at at cp->c_bufer + base */

	if(payload){
		wr = write(cs->c_ffd, cs->c_buffer + base, payload);
		if(wr < payload){
			fprintf(stderr, "process: unable to write payload of %d\n", payload);
			return -1;
		}

		cs->c_rxdata += payload;

		/*This is lame but i think it works*/
		if(!cs->c_offset){
			cs->c_tracker = 0;
			cs->c_tracker += payload;
		}
		else{
			cs->c_tracker += payload;
		}

		/*Check for lost packets*/
		if((cs->c_tracker-payload) != cs->c_offset){
			cs->c_lostpackets++;
			cs->lost_flag = 1;
		}
		fprintf(stderr, "%lu %lu %d->%d\n", cs->c_rxdata, (cs->c_tracker-payload) , cs->c_offset, cs->lost_flag);


		if(cs->c_text != NULL){
			/* TODO: maybe write data out in human readable form to cs->c_text ? */
			/* fprintf(cs->c_text, "..."); */

			if(cs->c_new){
				collect_precalculate(cs);
				cs->c_new = 0;
			}

#ifdef DEBUG
			fprintf(stderr, "base=%d, payload=%d, size=%d\n", base, payload, cs->c_size);
#endif

			for(j = base; j < (base + payload); j += cs->c_size){
				value = 0;
				compare = cs->c_buffer[base + cs->c_extra];
				if(compare & 0x80){
					flag = 1;
				}
				for(k = 0; k < cs->c_size; k++){
					value *= 256;
					value += cs->c_buffer[j + cs->c_extra + (cs->c_direction * k)];
				}
				/*Check for data type:unsigned,signed or float*/
				if(!cs->c_datatype){
					fprintf(cs->c_text,"%u%c", value, (cs->c_cnt == 0 || cs->c_cnt % 23 != 0 ) ? ',' : '\n');
				}
				else if(cs->c_datatype == 1){
					if(flag){
						value = (value | cs->c_mask);
					}
					if((cs->c_cnt % 2) == 0){
						real_raw[(cs->c_counter * 12) + (cs->c_cnt / 2)] = value;
					}
					else{
						imag_raw[(cs->c_counter * 12) + (cs->c_cnt / 2)] = value;
					}
					fprintf(cs->c_text,"%d%c", value, (cs->c_cnt == 0 || cs->c_cnt % 23 != 0) ? ',' : '\n');
				}
				else{
					/*TODO:Floating point case*/
				}
				flag = 0;

				cs->c_cnt++;

				if(cs->c_cnt == 24){
					cs->c_cnt = 0;
					cs->c_counter++;
				}

				if(cs->c_counter == 512 ){
					if(!cs->lost_flag){
						/*Display real time power and phase plots*/
						if(display_baseline(cs->c_baseline, bsln_disp, real_raw, imag_raw) < 0){
							fprintf(stderr,"main: error getting and displaying baseline %d\n", cs->c_baseline);
							return -1;
						}
					}
					cs->c_counter = 0;
					cs->lost_flag = 0;

				}
			}
		}
	}

	return result;
}
Beispiel #2
0
int collect_process(struct collect_state *cs)
{
  struct header_poco *hp;
  struct option_poco *op;
  unsigned int options, base, payload, i;
  int wr, or, result;
  int j, k;
  unsigned int value, compare, flag;
  unsigned int cnt = 1;

  result = 0;
  compare = 0;

  if(cs->c_have < 8){
    fprintf(stderr, "process: short packet (len=%u)\n", cs->c_have);
    return -1;
  }

  hp = (struct header_poco *) cs->c_buffer;

  if(hp->h_magic != htons(MAGIC_HEADER_POCO)){
    fprintf(stderr, "process: bad header magic 0x%04x\n", hp->h_magic);
    cs->c_errors++;
    return -1;
  }


  if(hp->h_version != htons(VERSION_HEADER_POCO)){
    fprintf(stderr, "process: odd version %d\n", ntohs(hp->h_version));
    cs->c_errors++;
    return -1;
  }

  options = ntohs(hp->h_options);
  base = (options + 1) * 8;

  if(base > cs->c_have){
    fprintf(stderr, "process: options larger than packet itself\n");
    cs->c_errors++;
    return -1;
  }

  payload = cs->c_have - base;

  if(cs->c_meta){
    fprintf(cs->c_meta, "frame %lu: options %u, length %u, payload %u\n", cs->c_rxp, options, cs->c_have, payload);
  }

  for(i = 0; i < options; i++){
    op = (struct option_poco *)(cs->c_buffer + ((i + 1) * 8));
    or = option_process(cs, op);
    if(or){
      result = or;
    }
  }

  cs->c_rxopts += options;

  /* at this point we have the number of data bytes in payload, and the start of data at at cp->c_bufer + base */

  if(payload){
    wr = write(cs->c_ffd, cs->c_buffer + base, payload);
    if(wr < payload){
      fprintf(stderr, "process: unable to write payload of %d\n", payload);
      return -1;
    }

    cs->c_rxdata += payload;

    if(cs->c_text != NULL){
      /* TODO: maybe write data out in human readable form to cs->c_text ? */
      /* fprintf(cs->c_text, "..."); */

      if(cs->c_new){
        collect_precalculate(cs);
        cs->c_new = 0;
      }

#ifdef DEBUG
      fprintf(stderr, "base=%d, payload=%d, size=%d\n", base, payload, cs->c_size);
#endif

      for(j = base; j < (base + payload); j += cs->c_size){
        value = 0;
        compare = cs->c_buffer[base + cs->c_extra];
        if(compare & 0x80){
          flag = 1;
        }
        for(k = 0; k < cs->c_size; k++){
          value *= 256;
          value += cs->c_buffer[j + cs->c_extra + (cs->c_direction * k)];
        }
        /*Check for data type:unsigned,signed or float*/
        if(!cs->c_datatype){
          fprintf(cs->c_text,"%u%c", value, (cnt % 24 != 0) ? ' ' : '\n');
        }
        else if(cs->c_datatype == 1){
          if(flag){
            value = (value | cs->c_mask);
          }
          fprintf(cs->c_text,"%d%c", value, (cnt % 24 != 0) ? ' ' : '\n');
        }
        else{
          /*TODO:Floating point case*/
        }
        flag = 0;
        cnt++;

        if(cnt == 24){
          cnt = 0;
        }
      }
    }
  }

  return result;
}