Esempio n. 1
0
int decode(unsigned char *address, const size_t size)
{
	Frequency freq;
	RangeCoder rc;

	image_buf = address;
	image_size = size;

	rc_initialize(&rc, bgetc, bputc);
	frequency_initialize(&freq);

	return rc_decode(&freq, &rc);
}
Esempio n. 2
0
int rc_analyze(int port, struct rcspec *rc){
  struct irspec ir;
  int i;
  int ret;
  int length;
  int index;
  long son[RC_SIGLEN], soff[RC_SIGLEN];
  long *work;

  // setup required parameters
  ir.fd = rc_passign(port);
  if(ir.fd <= 0){
    fprintf(stderr, "Port invalid.\n");
    return -1;
  }
  ir.son = son;
  ir.soff = soff;

  ret = rc_start(&ir);// wait for first shot
  if(ret <= 0){
    fprintf(stderr, "Illegal signal format.\n");
    close(ir.fd);
    rc_pfree(port);
    return -1;
  }
  rc_record(&ir);// record signal
  length = ir.length;// save signal length in bits

  ret = rc_next(&ir);// check next shot
  if(ret <= 0){
    rc->multi = 0;
  }
  else
  if((ir.repeat < ir.loff * 8 / 10) ||
  (ir.repeat > ir.loff * 12 / 10)){
    fprintf(stderr, "Repeat code was found. 2nd signal was reduced.\n"
    "Leader off: %dusec, standard: %dusec.\n", ir.repeat, ir.loff);
    rc->multi = 0;
  } else {
    ir.code = rc->code2;
    rc_decode(&ir);
    rc->multi = 1;
  }

  close(ir.fd);
  rc_pfree(port);

  //report analyze
  rc->lon = ir.lon;
  rc->loff = ir.loff;

  // analyze T
  work = (long *)calloc(length, sizeof(long));
  for(i = 0; i < length; i++)
    work[i] = son[i];
  rc->t = rc_center(work, length);

  // analyze H length
  index = 0;
  for(i = 0; i < length; i++){
    if(rc->t * 2 < soff[i]){
      work[index++] = soff[i];
    }
  }
  rc->h = rc_center(work, index);

 // analyze L length
  index = 0;
  for(i = 0; i < length; i++){
    if(rc->t * 2 >= soff[i]){
      work[index++] = soff[i];
    }
  }
  rc->l = rc_center(work, index);

  free(work);

  // decode signal
  for(i = 0; i < length; i++){
    rc->code1[i / 8] <<= 1;
    rc->code1[i / 8] |= (rc->t * 2 < soff[i]);
  }

  rc->count1 = (length + 7) / 8;
  if(length % 8)
    fprintf(stderr, "1st shot is not filled with bit\n");

  if(rc->multi){
    rc->interval = ir.interval;
    rc->gap = ir.gap;
    rc->count2 = ir.count;
    if(ir.length % 8)
      fprintf(stderr, "2nd shot is not filled with bit\n");
  }
  return 0;
}
Esempio n. 3
0
void cb_rec(Fl_Widget* widget, void* pall){
	int i;
	char buf[80];
	int ret;
	int length;
	int index;
	long *work;
	allspec *all;

	all = (allspec *)pall;
	all->ir.fd = rc_passign(all->op.port);
	if(all->ir.fd <= 0){
		close(all->ir.fd);
		rc_pfree(all->op.port);
		all->report_buf->text("Port invalid.\nRestoration carried out.\nTry again.");
		return;
	}

	ret = rc_start(&all->ir);
	if(ret <= 0){
		all->report_buf->text("Illegal signal format.\nTry again.");
		close(all->ir.fd);
		rc_pfree(all->op.port);
		return;
	}

	rc_record(&all->ir);
	length = all->ir.length;

	ret = rc_next(&all->ir);
	if(ret <= 0){
		all->rc.multi = 0;
	} else
	if((all->ir.repeat < all->ir.loff * 8 / 10) ||
	(all->ir.repeat > all->ir.loff * 12 / 10)){
		fprintf(stderr, "WARNNING: Repeat code was found. 2nd signal was reducd.\n"
		"Leader off: %dusec, standard: %dusec.\n", all->ir.repeat, all->ir.loff);
		all->rc.multi = 0;
	} else {
		all->ir.code = all->rc.code2;
		rc_decode(&all->ir);
		all->rc.multi = 1;
	}

	close(all->ir.fd);
	rc_pfree(all->op.port);

	// setup all->rc
	all->rc.lon = all->ir.lon;
	all->rc.loff = all->ir.loff;
	for(i = 0; i < length; i++){
		all->rc.code1[i / 8] <<= 1;
		all->rc.code1[i / 8] |= (all->ir.son[i] * 2 < all->ir.soff[i]);
	}

	all->rc.count1 = (length + 7) / 8;
	if(length % 8)
		fprintf(stderr, "WARNNING: 1st shot is not filled with bit.\n");

	if(all->rc.multi){
		all->rc.interval = all->ir.interval;
		all->rc.gap = all->ir.gap;
		all->rc.count2 = all->ir.count;
		if(all->ir.length % 8)
		fprintf(stderr, "WARNNING: 2nd shot is not filled with bit.\n");
	}

	work = (long *)calloc(length, sizeof(long));
	for(i = 0; i < length; i++)
		work[i] = all->ir.son[i];
	all->rc.t = all->dist_t->setdata(length, work);

	index = 0;
	for(i = 0; i < length; i++)
		if(all->rc.t * 2 < all->ir.soff[i])
			index++;
	work = (long *)calloc(index, sizeof(long));
	index = 0;
	for(i = 0; i < length; i++)
		if(all->rc.t * 2 < all->ir.soff[i])
			work[index++] = all->ir.soff[i];
	all->rc.h = all->dist_1->setdata(index, work);

	index = 0;
	for(i = 0; i < length; i++)
		if(all->rc.t * 2 >= all->ir.soff[i])
			index++;
	work = (long *)calloc(index, sizeof(long));
	index = 0;
	for(i = 0; i < length; i++)
		if(all->rc.t * 2 >= all->ir.soff[i])
			work[index++] = all->ir.soff[i];
	all->rc.l = all->dist_0->setdata(index, work);

	all->wave_l->setdata(all->rc.lon, all->rc.loff);
	all->wave_1->setdata(all->rc.t, all->rc.h);
	all->wave_0->setdata(all->rc.t, all->rc.l);

	all->report_buf->text("Analyze complete as follows.\n\n");

	if(all->rc.multi)
		all->report_buf->append("1st signal\n");

	sprintf(buf, "Signal count: %dbytes.\n", all->rc.count1);
	all->report_buf->append(buf);

	for(i = 0; i < all->rc.count1 - 1; i++){
		sprintf(buf, "%02X", all->rc.code1[i]);
		all->report_buf->append(buf);
		all->report_buf->append((i + 1) % 8 ? ", " : "\n");
	}
	sprintf(buf, "%02X.\n\n", all->rc.code1[i]);
	all->report_buf->append(buf);

	if(all->rc.multi){
		sprintf(buf, "Gap: %dusec.\n", all->rc.gap);
		all->report_buf->append(buf);
		sprintf(buf, "Interval: %dusec.\n\n", all->rc.interval);
		all->report_buf->append(buf);

		sprintf(buf, "Signal count: %dbytes.\n", all->rc.count2);
		all->report_buf->append(buf);

		for(i = 0; i < all->rc.count2 - 1; i++){
			sprintf(buf, "%02X", all->rc.code2[i]);
			all->report_buf->append(buf);
			all->report_buf->append((i + 1) % 8 ? ", " : "\n");
		}
		sprintf(buf, "%02X.\n\n", all->rc.code2[i]);
		all->report_buf->append(buf);
	}
	all->new_data = 1;
	all->btn_play->activate();
	all->btn_memo->activate();
}