Esempio n. 1
0
char* parse_string(const std::string & s)
{
    char* buffer = new char[s.size() / 2];
    for (std::size_t i = 0; i != s.size() / 2; ++i)
        buffer[i] = 16 * parse_hex(s[2 * i]) + parse_hex(s[2 * i + 1]);
    return buffer;
}
Esempio n. 2
0
/**
 * Call for chars after a backlash to decode the escape sequence.
 *
 * Stores the result in *ch.
 *
 * Returns the number of bytes consumed.
 */
static int reg_decode_escape(const char *s, int *ch)
{
	int n;
	const char *s0 = s;

	*ch = *s++;

	switch (*ch) {
		case 'b': *ch = '\b'; break;
		case 'e': *ch = 27; break;
		case 'f': *ch = '\f'; break;
		case 'n': *ch = '\n'; break;
		case 'r': *ch = '\r'; break;
		case 't': *ch = '\t'; break;
		case 'v': *ch = '\v'; break;
		case 'u':
			if ((n = parse_hex(s, 4, ch)) > 0) {
				s += n;
			}
			break;
		case 'x':
			if ((n = parse_hex(s, 2, ch)) > 0) {
				s += n;
			}
			break;
		case '\0':
			s--;
			*ch = '\\';
			break;
	}
	return s - s0;
}
Esempio n. 3
0
unsigned godob::read_quad(void)
{
  unsigned long t0 = millis();
  unsigned r=0;
  while(Serial.available()<4 && millis()-t0<100);
  if(Serial.available()>=4){
    r  = parse_hex(Serial.read())*0x1000;
    r += parse_hex(Serial.read())*0x100;
    r += parse_hex(Serial.read())*0x10;
    r += parse_hex(Serial.read())*0x1;
  }
  return r;
}
Esempio n. 4
0
/**
 * Call for chars after a backlash to decode the escape sequence.
 *
 * Stores the result in *ch.
 *
 * Returns the number of bytes consumed.
 */
static int reg_decode_escape(const char *s, int *ch)
{
	int n;
	const char *s0 = s;

	*ch = *s++;

	switch (*ch) {
		case 'b': *ch = '\b'; break;
		case 'e': *ch = 27; break;
		case 'f': *ch = '\f'; break;
		case 'n': *ch = '\n'; break;
		case 'r': *ch = '\r'; break;
		case 't': *ch = '\t'; break;
		case 'v': *ch = '\v'; break;
		case 'u':
			if (*s == '{') {
				/* Expect \u{NNNN} */
				n = parse_hex(s + 1, 6, ch);
				if (n > 0 && s[n + 1] == '}' && *ch >= 0 && *ch <= 0x1fffff) {
					s += n + 2;
				}
				else {
					/* Invalid, so just treat as an escaped 'u' */
					*ch = 'u';
				}
			}
			else if ((n = parse_hex(s, 4, ch)) > 0) {
				s += n;
			}
			break;
		case 'U':
			if ((n = parse_hex(s, 8, ch)) > 0) {
				s += n;
			}
			break;
		case 'x':
			if ((n = parse_hex(s, 2, ch)) > 0) {
				s += n;
			}
			break;
		case '\0':
			s--;
			*ch = '\\';
			break;
	}
	return s - s0;
}
Esempio n. 5
0
int main(int argc, char *argv[]){

    const char mac_addr[] = "01:02:03:04:05:ff";
    parse_hex(mac_addr);

    return 0;
}
bool Ublox::check_checksum()
{
    if (buf[strlen(buf)-5] == '*')
    {
        uint16_t sum = parse_hex(buf[strlen(buf)-4]) * 16;
        sum += parse_hex(buf[strlen(buf)-3]);

        for (uint8_t i=1; i < (strlen(buf)-5); i++)
            sum ^= buf[i];
        if (sum != 0)
            return false;

        return true;
    }
    return false;
}
Esempio n. 7
0
  bool decode(std::string& s)
  {
    size_t pos = s.find(ENCODE_BEGIN_CHAR);
    if (pos == std::string::npos)
    {
      // Handle the "99%" case fast.
      return true;
    }

    std::string v;
    for (size_t i = 0;;)
    {
      if (pos == std::string::npos)
      {
        v.append(s, i, s.size() - i); // Append up to end.
        break;
      }
      v.append(s, i, pos - i); // Append up to char.
      i = pos + 3; // Skip all 3 chars.
      char c;
      if (!parse_hex(s, pos + 1, c))
      {
        // Convert hex.
        return false;
      }
      v.insert(v.end(), c); // Append converted hex.
      pos = s.find(ENCODE_BEGIN_CHAR, i); // Find next
    }
    s = v;
    return true;
  }
Esempio n. 8
0
TEST(SecurityManager, CMACTest){

    mock_init();
    mock_simulate_hci_state_working();

    // expect le encrypt commmand
    CHECK_HCI_COMMAND(test_command_packet_01);

    aes128_report_result();

    // expect le encrypt commmand
    CHECK_HCI_COMMAND(test_command_packet_02);

    aes128_report_result();
    mock_clear_packet_buffer();

    // additional test: cmac signing
    // aes cmac tests
    sm_key_t key;
    parse_hex(key, key_string);
    uint8_t message [] = "hallo";
    cmac_hash_received = 0;
    sm_cmac_signed_write_start(key, 0x11, 0x1234, sizeof(message), message, 1, &cmac_done);
    while (!cmac_hash_received){
        aes128_report_result();
    }
    uint8_t expected_hash[] = { 0x40, 0x4E, 0xDC, 0x0F, 0x6E, 0x0F, 0xF9, 0x5C};
    CHECK_EQUAL_ARRAY(expected_hash, cmac_hash, 8);

    // generic aes cmac tests
    VALIDATE_MESSAGE(m0);
    VALIDATE_MESSAGE(m16);
    VALIDATE_MESSAGE(m40);
    VALIDATE_MESSAGE(m64);
}
Esempio n. 9
0
File: mgmt.c Progetto: greearb/iw-ct
static int register_mgmt_frame(struct nl80211_state *state,
			       struct nl_msg *msg, int argc, char **argv,
			       enum id_input id)
{
	unsigned int type;
	unsigned char *match;
	size_t match_len;
	int ret;

	ret = sscanf(argv[0], "%x", &type);
	if (ret != 1) {
		printf("invalid frame type: %s\n", argv[0]);
		return 2;
	}

	match = parse_hex(argv[1], &match_len);
	if (!match) {
		printf("invalid frame pattern: %s\n", argv[1]);
		return 2;
	}

	NLA_PUT_U16(msg, NL80211_ATTR_FRAME_TYPE, type);
	NLA_PUT(msg, NL80211_ATTR_FRAME_MATCH, match_len, match);

	return 0;

nla_put_failure:
	return -ENOBUFS;
}
Esempio n. 10
0
void read_dev_mcast(struct ma_info **result_p)
{
	char buf[256];
	FILE *fp = fopen(_PATH_PROCNET_DEV_MCAST, "r");

	if (!fp)
		return;

	while (fgets(buf, sizeof(buf), fp)) {
		char hexa[256];
		struct ma_info m;
		int len;
		int st;

		memset(&m, 0, sizeof(m));
		sscanf(buf, "%d%s%d%d%s", &m.index, m.name, &m.users, &st,
		       hexa);
		if (filter_dev[0] && strcmp(filter_dev, m.name))
			continue;

		m.addr.family = AF_PACKET;

		len = parse_hex(hexa, (unsigned char*)&m.addr.data);
		if (len >= 0) {
			struct ma_info *ma = xmalloc(sizeof(m));
			memcpy(ma, &m, sizeof(m));
			ma->addr.bytelen = len;
			ma->addr.bitlen = len<<3;
			if (st)
				ma->features = "static";
			maddr_ins(result_p, ma);
		}
	}
	fclose(fp);
}
Esempio n. 11
0
void read_igmp6(struct ma_info **result_p)
{
	char buf[256];
	FILE *fp = fopen("/proc/net/igmp6", "r");

	if (!fp)
		return;

	while (fgets(buf, sizeof(buf), fp)) {
		char hexa[256];
		struct ma_info m;
		int len;

		memset(&m, 0, sizeof(m));
		sscanf(buf, "%d%s%s%d", &m.index, m.name, hexa, &m.users);

		if (filter.dev && strcmp(filter.dev, m.name))
			continue;

		m.addr.family = AF_INET6;

		len = parse_hex(hexa, (unsigned char*)&m.addr.data);
		if (len >= 0) {
			struct ma_info *ma = malloc(sizeof(m));

			memcpy(ma, &m, sizeof(m));

			ma->addr.bytelen = len;
			ma->addr.bitlen = len<<3;
			maddr_ins(result_p, ma);
		}
	}
	fclose(fp);
}
Esempio n. 12
0
static int parse(FileImpl* impl)
{
    char* s = impl->line;

    while ( isspace(*s) )
        s++;

    switch ( *s )
    {
    case '\0':
        impl->line[0] = '\0';
        return flush(impl);

    case '#':
        break;

    case '$':
        if ( impl->idx )
            return flush(impl);

        parse_command(impl, s+1);
        break;

    case '"':
        parse_string(impl, s+1);
        break;

    case 'x':
        parse_hex(impl, s+1);
        break;
    }
    impl->line[0] = '\0';
    return 0;
}
Esempio n. 13
0
static char *parse_u24(char *p, u32 *valp)
{
	u32 result = 0;
	u32 tval;

	p = parse_hex(p, &tval);
	result |= tval << 0;

	p = parse_hex(p, &tval);
	result |= tval << 8;

	p = parse_hex(p, &tval);
	result |= tval << 16;

	*valp = result;
	return p;
}
Esempio n. 14
0
bool parse_hex ( Octet &val, std::string const &s, std::string::size_type pos )
{
    bool r=false;
    if( s.length() >= pos+2 )
    {
        r=parse_hex(val,s[pos],s[pos+1]);
    }
    return r;
}
Esempio n. 15
0
void parse_shared_pool(char *s)
{
    char pool_type[3];
    char buf[BUFSIZE];
    unsigned long pool_id = parse(s,"PI");
    unsigned long long uid0 = parse_hex(s,"U0");
    unsigned long long uid1 = parse_hex(s,"U1");
    unsigned long long pgp_count = parse(s,"Pc");
    unsigned long long max_pgp_count = parse(s,"Pm");
    unsigned long long obj_count = parse(s,"Oc");
    unsigned long long max_obj_count = parse(s,"Om");
    unsigned long long objnode_count = parse(s,"Nc");
    unsigned long long max_objnode_count = parse(s,"Nm");
    unsigned long long good_puts = parse(s,"ps");
    unsigned long long puts = parse(s,"pt");
    unsigned long long no_mem_puts = parse(s,"px");
    unsigned long long dup_puts_flushed = parse(s,"pd");
    unsigned long long dup_puts_replaced = parse(s,"pr");
    unsigned long long found_gets = parse(s,"gs");
    unsigned long long gets = parse(s,"gt");
    unsigned long long flushs_found = parse(s,"fs");
    unsigned long long flushs = parse(s,"ft");
    unsigned long long flush_objs_found = parse(s,"os");
    unsigned long long flush_objs = parse(s,"ot");

    parse_string(s,"PT",pool_type,2);
    parse_sharers(s,"SC",buf,BUFSIZE);
    printf("poolid=%lu[%s] uuid=%llx.%llx, shared-by:%s: "
           "pgp=%llu(max=%llu) obj=%llu(%llu) "
           "objnode=%llu(%llu) puts=%llu/%llu/%llu(dup=%llu/%llu) "
           "gets=%llu/%llu(%llu%%) "
           "flush=%llu/%llu flobj=%llu/%llu\n",
           pool_id, pool_type, uid0, uid1, buf,
           pgp_count, max_pgp_count, obj_count, max_obj_count,
           objnode_count, max_objnode_count,
           good_puts, puts, no_mem_puts, 
           dup_puts_flushed, dup_puts_replaced,
           found_gets, gets,
           gets ? (found_gets*100LL)/gets : 0,
           flushs_found, flushs, flush_objs_found, flush_objs);
}
Esempio n. 16
0
static unsigned long __get_uint_hex(const char* s)
{
  unsigned long res = 0;
  while (*s) {
    if (is_hex(*s))
      res = (res << 4) + parse_hex(*s);
    else if (*s != '_')
      break;
    s++;
  }
  return res;
}
/**
 * Set node address
 * Args: <node-addr>
 */
int cmd_set_uart_speed (int argc, uint8_t **argv) {

	if (argc != 2) {
		return E_WRONG_ARGC;
	}

	uint32_t bps = parse_hex(argv[1]);

	MyUARTxInit(LPC_USART0, bps);

	return E_OK;
}
Esempio n. 18
0
unsigned char
checksum(char* str)
{
  unsigned int i;
  unsigned char acum=0;

  for(i=0; i < ((strlen(str)-1)/2);i++)
  {
    acum+=parse_hex(str+1+(i*2),2);
  }
  
  return acum;
}
Esempio n. 19
0
static void validate_message(const char * name, const char * message_string, const char * cmac_string){

    mock_clear_packet_buffer();
    int len = parse_hex(m, message_string);

    // expected result
    sm_key_t cmac;
    parse_hex(cmac, cmac_string);

    printf("-- verify key %s message %s, len %u:\nm:    %s\ncmac: %s\n", key_string, name, len, message_string, cmac_string);

    sm_key_t key;
    parse_hex(key, key_string);
    // printf_hexdump(key, 16);

    cmac_hash_received = 0;
    sm_cmac_general_start(key, len, &get_byte, &cmac_done);
    while (!cmac_hash_received){
        aes128_report_result();
    }
    CHECK_EQUAL_ARRAY(cmac, cmac_hash, 16);
}
Esempio n. 20
0
static int cpn_sign_sk_from_hex(struct cpn_sign_sk *out, const char *hex)
{
    if (hex == NULL) {
        cpn_log(LOG_LEVEL_ERROR, "Error parsing nonexistent secret signature key");
        return -1;
    }

    if (parse_hex(out->data, sizeof(out->data), hex, strlen(hex)) < 0) {
        cpn_log(LOG_LEVEL_ERROR, "Error parsing invalid secret signature key");
        return -1;
    }
    return 0;
}
Esempio n. 21
0
void UnescapeString(char *str)
{
	// fast forward to any escape sequence
	while (*str && *str != '\\')
		str++;

	char *dst = str, *src = str;
	while (*src)
	{
		if (*src == '\\')
		{
			bool code_found = true;
			switch (src[1])
			{
			case 'a': *dst = '\a'; break;
			case 'b': *dst = '\b'; break;
			case 'f': *dst = '\f'; break;
			case 'n': *dst = '\n'; break;
			case 'r': *dst = '\r'; break;
			case 't': *dst = '\t'; break;
			case 'v': *dst = '\v'; break;
			case '0': *dst = '\0'; break;
			case '\"': *dst = '\"'; break;
			case '\'': *dst = '\''; break;
			case '\\': *dst = '\\'; break;
			case 'x': // \xXX
			case 'u': // \uXXXX
			{
				// This should be safe. A utf-8 character can be at most 4 bytes,
				// and we have 4 bytes to use for \xXX and 6 for \uXXXX.
				src += 2;
				if (UCS4 hex = parse_hex(src, src[1] == 'x' ? 2 : 4))
					dst += utf8::encode(hex, dst);
				continue;
			}
			default:
				code_found = false;
			}
			if (code_found)
			{
				src += 2;
				dst++;
				continue;
			}
		}
		*dst = *src;
		dst++;
		src++;
	}
	*dst = 0;
}
Esempio n. 22
0
static void parse_string(query_result r, char* buf)
{
  if (r.start < r.end) {
    if (*r.start == '"') {
      for (const char* p = r.start + 1; p < r.end && *p != '"'; p++) {
        char ch = p[0];
        if (ch == '\\' && p[1] == 'x' && is_hex(p[2])) {
          ch = parse_hex(p[2]);
          if (is_hex(p[3])) {
            ch = (ch << 4) + parse_hex(p[3]);
            p++;
          }
          p += 2;
        }
        *buf++ = ch;
      }
    } else {
      for (const char* p = r.start; p < r.end && *p > ' '; p++)
        *buf++ = *p;
    }
  }
  *buf = 0;
}
Esempio n. 23
0
static int I2cWriteReadCommand(int argc, char const ** argv) {
  if (argc < 2 || argc > 18) return -1;

  uint8_t addr = (uint8_t) parse_hex(argv[0]);
  ++argv;
  --argc;

  size_t readlen = (size_t) parse_number(argv[argc - 1]);
  --argc;

  uint8_t buf[16];
  for (int i = 0; i < argc; ++i) {
    buf[i] = (uint8_t) parse_hex(argv[i]);
  }

  if (ERROR_NONE != I2cWriteRead(addr, buf, argc, buf, readlen)) return -3;

  for (int i = 0; i < readlen; ++i) {
    printf("%02x ", buf[i]);
  }
  printf("\r\n");

  return 0;
}
Esempio n. 24
0
File: busio.c Progetto: joaohf/dtree
/**
 * Performs a sequence of write actions based on a file input.
 * The file input are hexadecimal numbers (given in parse_hex
 * compatible format), one per line.
 *
 * The given file descriptor is closed (even on error).
 */
int perform_file_write(const char *dev, uint32_t addr, uint32_t len, FILE *f)
{
	char s_value [S_BUFFSIZE];
	uint32_t value;

	assert(f != NULL);

	struct dtree_dev_t *d = dtree_byname(dev);
	if(d == NULL) {
		fprintf(stderr, "No device '%s' found\n", dev);
		fclose(f);
		return 1;
	}

	while (fgets(s_value, S_BUFFSIZE, f) != NULL) {
		size_t s_len = strlen(s_value);

		if (s_value[s_len - 1] == '\n') {
			s_value[s_len - 1] = '\0';
		}

		value = parse_hex(s_value, s_len);

		verbosity_printf(1, "Action: write, device: '%s', offset: '0x%08X', data: '0x%08X', len: '%d'", dev, addr, value, len);

		const dtree_addr_t base = dtree_dev_base(d);
		const dtree_addr_t high = dtree_dev_high(d);

		if(base < high) {
			if(base + addr + len > high) {
				verbosity_printf(1, "Address is out of range of the device: 0x%08X (high: 0x%08X)", base + addr, high);
				return 2;
			}
		}

		bus_write(base, addr, value, len);

		addr += len;
	}

	dtree_dev_free(d);
	fclose(f);

	return 0;
}
/*
 * Parse the given query string to extract the parameter pname
 * and return to the caller. (Not the best way to do it but
 * going for simplicity at the moment.)
 */
char *
get_param(char *qstr, const char *pname)
{
	if (qstr == NULL)
		return NULL;

	char *temp;
	char *param = NULL;
	char *value = NULL;
	size_t sz;
	while (*qstr) {
		sz = strcspn(qstr, "=&");
		if (qstr[sz] == '=') {
			qstr[sz] = 0;
			param = qstr;
		}
		qstr += sz + 1;
		
		if (param && strcmp(param, pname) == 0)
			break;
		else
			param = NULL;
	}
	if (param == NULL) 
		return NULL;

	if ((temp = strchr(qstr, '&')) == NULL)
		value = strdup(qstr);
	else {
		sz = temp - qstr;
		value = malloc(sz + 1);
		if (value == NULL)
			errx(EXIT_FAILURE, "malloc failed");
		memcpy(value, qstr, sz);
		value[sz] = 0;
	}
	value = parse_space(value);
	char *retval = parse_hex(value);
	free(value);
	return retval;
}
Esempio n. 26
0
static int cmd_keyboard_id(const char *args)
{
	int v = ERR_INVALID_ARGS;
	char *t = get_token(args);

	if (!t) goto ret;
	if (!strcmp(t, "any")) {
		current_keyboard_id = 0;
		v = 0;
	} else {
		v = parse_hex(args, 0, 0xffff);
		if (v != INVALID_NUMBER) {
			current_keyboard_id = (unsigned short)v;
			v = 0;
		}
	}
	free(t);

ret:
	return v;
}
Esempio n. 27
0
/* Converts a string with an html entity to it's encoded form, which is written
 * to the output string.
 */
static const char *entity_convert(const char *s, char *output, char terminator)
{
  /* TODO(falmeida): Handle wide char encodings */
    struct entityfilter_table_s *t = entityfilter_table;

    if (s[0] == '#') {
      if (s[1] == 'x' || s[1] == 'X') { /* hex */
          return parse_hex(s + 2, output);
      } else { /* decimal */
          return parse_dec(s + 1, output);
      }
    }

    while (t->entity != NULL) {
        if (strcasecmp(t->entity, s) == 0)
            return t->value;
        t++;
    }

    snprintf(output, HTMLPARSER_MAX_ENTITY_SIZE, "&%s%c", s, terminator);
    output[HTMLPARSER_MAX_ENTITY_SIZE - 1] = '\0';

    return output;
}
Esempio n. 28
0
int main(int argc, char **argv) {
	int trace=0;
	char file[512], cryptdata[128];
	mf_t trace_mf;
	dpa_t *dpa=NULL;
	uint8_t hypotheses[1024], key[16], plain[16];
	int hypos=0;
	correl_t *results=NULL;
	time_t start=0, runtime;
	int cnt;
	int last_cnt=0;
	FILE *fl, *ptxts;
	float signif;
	int best_keybyte=0;
	float max_correl=0;
	hypo_template_t *hypo_templates;
	
	if(argc<=2) {
		printf("see the README\n");
		return 0;
	}
	
	sscanf(argv[1],"%2s:%d",file,&cnt);
	
	assert((fl=fopen("hypo.txt","w")));
	
	if(!(strcmp(file,"hd"))) {
		printf("Hamming-Distance keybyte %d\n",cnt);
		fprintf(fl,"sbox_out %d&ff sbox_in %d&ff 0 0\n",cnt,cnt);
	}
	else if(!(strcmp(file,"hw"))) {
		printf("Hamming-Weight keybyte %d\n",cnt);
		fprintf(fl,"sbox_out %d&ff null 0&ff 0 0\n",cnt);
	}
	else {
		printf("usage: hd:<keybyte> for hamming dist or hw:<keybyte> for hamming weight\n");
		return 0;
	}
	
	fclose(fl);
	
	// don't ask...
	assert((hypos = hypo_templ_gen("hypo.txt", &hypo_templates, NULL)));
	hypos *= 256;
	
	sprintf(file,"%s/aes.log",argv[2]);
	assert((ptxts = fopen(file, "r")));
	
	while(fgets(cryptdata, 512, ptxts)) {
		
		if(!(trace%20))
			printf("trace %d\n",trace);
				
		assert(parse_hex(cryptdata, plain, 16) == (cryptdata+32));
		
		sprintf(file,"%s/%06d.dat",argv[2],trace);
		assert(!(open_trace(&trace_mf, file)));
		
		// generate hypotheses
		for(cnt=0; cnt<256; cnt++) {
			memset(key, cnt&0xff, 16);
			hypo_gen(plain, key, hypo_templates, hypotheses+cnt);
		}
		
		if(!dpa) {
			dpa = dpa_init(hypos, trace_mf.len);
			assert((results = malloc(sizeof(correl_t)*(dpa->tracelen))));
			start = time(NULL);
		}
		
		dpa_add(dpa, trace_mf.ptr, hypotheses);
		
		trace++;
		last_cnt = trace;
		
		signif = 1.3*(4/sqrt((float)trace));
		
		max_correl = 0;
		best_keybyte = 0;
		
		if(!(trace%100)) {
		
			for(cnt=0; cnt<hypos; cnt++) {
				float max;
			
				dpa_get_results(dpa, cnt, results, &max);
			
				if(ABS(max) > ABS(max_correl)) {
					max_correl = max;
					best_keybyte = cnt;
				}
			}
			printf("key guess 0x%02x correl: %f (signifcant: >=%f)\n",best_keybyte,max_correl,signif);
		}
	}
	
	runtime = time(NULL);
	runtime -= start;
		
	dpa_speedinfo(dpa, runtime);
			
	// get results
	dpa_get_results(dpa, best_keybyte, results, NULL);
		
	assert((fl=fopen("results.txt","w")));
		
	for(cnt=0; cnt < dpa->tracelen; cnt++)
		fprintf(fl,"%d: %f\n",cnt,results[cnt]);
	
	fclose(fl);
	
	free(results);
	
	dpa_destroy(&dpa);
		
	return 0;
}
Esempio n. 29
0
void eepromCLI()
{
    uint32_t c1, c2;

    uint8_t  eepromQuery = 'x';
    uint8_t  validQuery  = false;

    cliBusy = true;

    cliPortPrint("\nEntering EEPROM CLI....\n\n");

    while(true)
    {
        cliPortPrint("EEPROM CLI -> ");

        while ((cliPortAvailable() == false) && (validQuery == false));

        if (validQuery == false)
            eepromQuery = cliPortRead();

        cliPortPrint("\n");

        switch(eepromQuery)
        {
        // 'a' is the standard "print all the information" character
        case 'a': // config struct data
            c1 = eepromConfig.CRCAtEnd[0];

            zeroPIDstates();

            c2 = crc32bEEPROM(&eepromConfig, false);

            cliPortPrintF("Config structure information:\n");
            cliPortPrintF("Version          : %d\n", eepromConfig.version );
            cliPortPrintF("Size             : %d\n", sizeof(eepromConfig) );
            cliPortPrintF("CRC on last read : %08X\n", c1 );
            cliPortPrintF("Current CRC      : %08X\n", c2 );

            if ( c1 != c2 )
                cliPortPrintF("  CRCs differ. Current Config has not yet been saved.\n");

            cliPortPrintF("CRC Flags :\n");
            cliPortPrintF("  History Bad    : %s\n", eepromConfig.CRCFlags & CRC_HistoryBad ? "true" : "false" );
            validQuery = false;
            break;

        ///////////////////////////

        case 'c': // Write out to Console in Hex.  (RAM -> console)
            // we assume the flyer is not in the air, so that this is ok;
            // these change randomly when not in flight and can mistakenly
            // make one think that the in-memory eeprom struct has changed

            zeroPIDstates();

            cliPortPrintF("\n");

            cliPrintEEPROM(&eepromConfig);

            cliPortPrintF("\n");

            if (crcCheckVal != crc32bEEPROM(&eepromConfig, true))
            {
                cliPortPrint("NOTE: in-memory config CRC invalid; there have probably been changes to\n");
                cliPortPrint("      eepromConfig since the last write to flash/eeprom.\n");
            }

            validQuery = false;
            break;

        ///////////////////////////

        case 'H': // clear bad history flag
            cliPortPrintF("Clearing Bad History flag.\n");
            eepromConfig.CRCFlags &= ~CRC_HistoryBad;
            validQuery = false;
            break;

        ///////////////////////////

        case 'C': // Read in from Console in hex.  Console -> RAM
            ;
            uint32_t sz = sizeof(eepromConfig);
            eepromConfig_t e;
            uint8_t *p = (uint8_t*)&e;
            uint8_t *end = (uint8_t*)(&e + 1);
            uint32_t t = millis();
            enum { Timeout = 100 }; // timeout is in ms
            int second_nibble = 0; // 0 or 1
            char c;
            uint32_t chars_encountered = 0;

            cliPortPrintF("Ready to read in config. Expecting %d (0x%03X) bytes as %d\n",
                          sz, sz, sz * 2);
            cliPortPrintF("hexadecimal characters, optionally separated by [ \\n\\r_].\n");
            cliPortPrintF("Times out if no character is received for %dms\n", Timeout);

            memset(p, 0, end - p);

            while (p < end)
            {
                while (!cliPortAvailable() && millis() - t < Timeout) {}
                t = millis();

                c = cliPortAvailable() ? cliPortRead() : '\0';
                int8_t hex = parse_hex(c);
                int ignore = c == ' ' || c == '\n' || c == '\r' || c == '_' ? true : false;

                if (c != '\0') // assume the person isn't sending null chars
                    chars_encountered++;
                if (ignore)
                    continue;
                if (hex == -1)
                    break;

                *p |= second_nibble ? hex : hex << 4;
                p += second_nibble;
                second_nibble ^= 1;
            }

            if (c == 0)
            {
                cliPortPrintF("Did not receive enough hex chars! (got %d, expected %d)\n",
                              (p - (uint8_t*)&e) * 2 + second_nibble, sz * 2);
            }
            else if (p < end || second_nibble)
            {
                cliPortPrintF("Invalid character found at position %d: '%c' (0x%02x)",
                              chars_encountered, c, c);
            }
            // HJI else if (crcCheckVal != crc32bEEPROM(&e, true))
            // HJI {
            // HJI     cliPortPrintF("CRC mismatch! Not writing to in-memory config.\n");
            // HJI     cliPortPrintF("Here's what was received:\n\n");
            // HJI     cliPrintEEPROM(&e);
            // HJI }
            else
            {
                // check to see if the newly received eeprom config
                // actually differs from what's in-memory

                zeroPIDstates();

                int i;
                for (i = 0; i < sz; i++)
                    if (((uint8_t*)&e)[i] != ((uint8_t*)&eepromConfig)[i])
                        break;

                if (i == sz)
                {
                    cliPortPrintF("NOTE: uploaded config was identical to in-memory config.\n");
                }
                else
                {
                    eepromConfig = e;
                    cliPortPrintF("In-memory config updated!\n");
                    cliPortPrintF("NOTE: config not written to EEPROM; use 'W' to do so.\n");
                }

            }

            // eat the next 100ms (or whatever Timeout is) of characters,
            // in case the person pasted too much by mistake or something
            t = millis();
            while (millis() - t < Timeout)
                if (cliPortAvailable())
                    cliPortRead();

            validQuery = false;
            break;

        ///////////////////////////

        case 'E': // Read in from EEPROM.  (EEPROM -> RAM)
            cliPortPrint("Re-reading EEPROM.\n");
            readEEPROM();
            validQuery = false;
            break;

        ///////////////////////////

        case 'x': // exit EEPROM CLI
            cliPortPrint("\nExiting EEPROM CLI....\n\n");
            cliBusy = false;
            return;
            break;

        ///////////////////////////

        case 'W':
        case 'e': // Write out to EEPROM. (RAM -> EEPROM)
            cliPortPrint("\nWriting EEPROM Parameters....\n\n");

            validQuery = false;
            writeEEPROM();
            break;

        ///////////////////////////

        case 'f': // Write out to sdCard FILE. (RAM -> FILE)
            validQuery = false;
            break;

        ///////////////////////////

        case 'F': // Read in from sdCard FILE. (FILE -> RAM)
            validQuery = false;
            break;

        ///////////////////////////

        case 'V': // Reset EEPROM Parameters
            cliPortPrint( "\nEEPROM Parameters Reset....(not rebooting)\n" );
            checkFirstTime(true);
            validQuery = false;
            break;


        ///////////////////////////

        case '?':
            //                0         1         2         3         4         5         6         7
            //                01234567890123456789012345678901234567890123456789012345678901234567890123456789
            cliPortPrintF("\n");
            cliPortPrintF("'a' Display in-RAM config information\n");
            cliPortPrintF("'c' Write in-RAM -> Console (as Hex)      'C' Read Console (as Hex) -> in-RAM\n");
            cliPortPrintF("'e' Write in-RAM -> EEPROM                'E' Read EEPROM -> in-RAM\n");
            cliPortPrintF("'f' Write in-RAM -> sd FILE (Not yet imp) 'F' Read sd FILE -> in-RAM (Not imp)\n");
            cliPortPrintF("                                          'H' Clear CRC Bad History flag\n");
            cliPortPrintF("                                          'V' Reset in-RAM config to default.\n");
            cliPortPrintF("'x' Exit EEPROM CLI                       '?' Command Summary\n");
            cliPortPrintF("\n");
            cliPortPrintF("For compatability:                        'W' Write in-RAM -> EEPROM\n");
            cliPortPrintF("\n");
            break;

            ///////////////////////////
        }
    }
}
Esempio n. 30
0
int
read_ihx(_pic * pic,const char * fname, int leeprom)
{
  FILE* fin;
  int  lc=0;
  unsigned int bc;
  char line[256];
  unsigned int nbytes,addr,type;  
  unsigned int addrx;
  unsigned short addrh=0;
  unsigned short addrl=0;
  char *mptr;

  fin=fopen(fname,"r");

  if(fin)
  {
    do
    {
      fgets(line,256,fin);
      lc++;
  
      /*for dos file*/ 
      if(line[strlen(line)-2]=='\r')
      {
        line[strlen(line)-2]='\n';
        line[strlen(line)-1]=0;
      } 

      if(checksum(line) == 0)
      {
        nbytes=parse_hex(line+1,2);
        addr=parse_hex(line+3,4);
        type=parse_hex(line+7,2);

	switch(type)
	{
	  case 0:
	    addrl=addr/2;

            if((((addrh<<16)|addrl)<<1) == 0x400E )
	    {
              //config
               mptr=(char*)pic->config;
               for(bc=0;bc < nbytes;bc++)
	       {
	         addrx=((addrh<<16)|addr)+bc-0x400E;
                 if((addrx/2) < pic->CONFIGSIZE)
	           mptr[addrx]=parse_hex(line+9+(bc*2),2);
               }
	    }
            else
	    {
              if((((addrh<<16)|addrl)<<1) >= 0x4200 )
              { 
                //EEPROM
                if(leeprom == 1) 
                for(bc=0;bc < nbytes;bc+=2)
	        {
                  addrx= (((addrh<<16)|addr)+bc-0x4200)/2;
                  if(addrx < pic->EEPROMSIZE*2)
	            pic->eeprom[addrx]=parse_hex(line+9+(bc*2),2);
                }
              }
              else
              {
                if((((addrh<<16)|addrl)<<1) >= 0x4000 )
                {
                  //IDS
                  mptr=(char*)pic->id;
                  for(bc=0;bc < nbytes;bc++)
	          {
	            addrx=((addrh<<16)|addr)+bc-0x4000;
                    if((addrx/2) < pic->IDSIZE)
	              mptr[addrx]=parse_hex(line+9+(bc*2),2);
                  }
                } 
                else
                {
                  //prog mem
                  mptr=(char*)pic->prog;
                  for(bc=0;bc < nbytes;bc++)
	          {
	            addrx=((addrh<<16)|addr)+bc;
                    if((addrx/2) < pic->ROMSIZE)
	              mptr[addrx]=parse_hex(line+9+(bc*2),2);
                  }
                }
              }
	    }
	  break;
	  case 1:
            fclose(fin);  
	    return 0;//no error
	  break;
	  case 4:
	    addrh=((parse_hex(line+9,2)<<8)|parse_hex(line+11,2));
	  break;
	}
      }
      else
      {
        printf("ERRO: Picsim->File bad checksum line %i!(%s)\n",lc,fname);
        fclose(fin);  
        return HEX_CHKSUM;
      }
     }
     while(!feof(fin));
     fclose(fin);  
  }
  else
  {
    printf("ERRO: Picsim->File not found!(%s)\n",fname);
    return HEX_NFOUND;
  }
  return 0;//no error
};