Beispiel #1
0
int32_t prm_get(const char *id, ...)
{
	va_list args;
	ParamRecord *rec;
	int res;
	Shadow *shadow = prm_findShadow(id);

	if (shadow && shadow->data)
	{
		va_start(args, id);
		res = Chirp::vdeserialize(shadow->data, shadow->len, &args);
		va_end(args);
	}
	else
	{
		rec = prm_find(id);
		if (rec==NULL)
			return -1;
	
		va_start(args, id);
		res = Chirp::vdeserialize((uint8_t *)rec+prm_getDataOffset(rec), rec->len, &args);
		va_end(args);
	}
	 	
	return res;
}
Beispiel #2
0
int32_t  prm_getAll(const uint16_t &index, Chirp *chirp)
{
	int res;
	uint16_t i;
	uint32_t len;
	uint8_t *data, argList[CRP_MAX_ARGS];
	ParamRecord *rec;
	Shadow *shadow;

	for (i=0, rec=(ParamRecord *)PRM_FLASH_LOC; rec->crc!=0xffff && rec<(ParamRecord *)PRM_ENDREC; i++, rec++)
	{
		if(i==index)
		{
			shadow = prm_findShadow(prm_getId(rec));

			if (shadow && shadow->data)
			{
				len = shadow->len;
				data = shadow->data;
			}
			else
			{
				len = rec->len;
				data = (uint8_t *)rec+prm_getDataOffset(rec);
			}
			res = Chirp::getArgList(data, rec->len, argList);
			if (res<0)
				return res;
			CRP_RETURN(chirp, UINT32(rec->flags), STRING(argList), STRING(prm_getId(rec)), STRING(prm_getDesc(rec)),  UINTS8(len, data), END);
			return 0;
		}
	}
	return -1;	
}
Beispiel #3
0
int32_t prm_setChirp(const char *id, const uint32_t &valLen, const uint8_t *val)
{
	ParamRecord *rec;
	uint8_t *buf;
	uint32_t offset;
	void *sector;
	int32_t res = 0;

	rec = prm_find(id);

	if (rec==NULL)
	{
		// Good god this is an ugly hack.  But, creating parameters should only be handled from within the firmware, so that the correct
		// description can be inserted.  There may be other parameters like this, such that when these parameters are lost, we want to resave,
		// in which case, we should formalize this hack somehow.
		if (strncmp(id, "Signature label", 15)==0)
		{
			char desc[100];
			sprintf(desc, "@c Signature_Labels Sets the label for objects that match signature%s.", id+15);
			prm_add(id, 0, desc, val[0], val+1, END);
			return 0;
		}
		return -1;
	}

	buf = (uint8_t *)malloc(FLASH_SECTOR_SIZE);
   	
	if (buf==NULL)
		return -2;

	sector = (void *)FLASH_SECTOR_MASK((uint32_t)rec);
	memcpy(buf, sector, FLASH_SECTOR_SIZE);

	rec = prm_find(id, buf);

	if (rec==NULL)
	{
		res = -1;
		goto end;
	}

	offset = prm_getDataOffset(rec);	
	if (memcmp((uint8_t *)rec+offset, val, valLen)==0)
		goto end;
	memcpy((uint8_t *)rec+offset, val, valLen);
	 	
	rec->len = valLen;
	rec->crc = prm_crc(rec);
	
	flash_erase((uint32_t)sector, FLASH_SECTOR_SIZE); 
	flash_program((uint32_t)sector, buf, FLASH_SECTOR_SIZE);


end:
	free(buf); 	
	return res;
}
Beispiel #4
0
int32_t prm_getChirp(const char *id, Chirp *chirp)
{
	ParamRecord *rec;

	rec = prm_find(id);
	if (rec==NULL)
		return -1;
	
	CRP_RETURN(chirp, UINTS8(rec->len, (uint8_t *)rec+prm_getDataOffset(rec)), END);

	return 0;
}
Beispiel #5
0
uint16_t prm_crc(const ParamRecord *rec)
{
	uint16_t crc;

	crc = Chirp::calcCrc((uint8_t *)rec+2, rec->len+prm_getDataOffset(rec)-2); // +2, -2 because we don't include crc 

	// crc can't equal 0xffff
	if (crc==0xffff)
		crc = 0;

	return crc;
}
Beispiel #6
0
int prm_add(const char *id, uint32_t flags, const char *desc, ...)
{
	char buf[PRM_MAX_LEN];
	int len;
    uint32_t freeLoc, offset=PRM_HEADER_LEN;
    va_list args;
	ParamRecord *rec = (ParamRecord *)buf;

	// if it already exists, 
	if (prm_find(id))
		return -2;

	memset((void *)rec, 0, PRM_MAX_LEN);

	strcpy((char *)rec+offset, id);
	offset += strlen(id) + 1;
	if (desc!=NULL)
	{
		strcpy((char *)rec+offset, desc);
		offset += strlen(desc) + 1;
	}
	else
	{
		*(char *)(rec+offset) = '\0';
	 	offset++;
	}

	// data section should be aligned to 4 bytes	
	ALIGN(offset, 4);

    va_start(args, desc);
    len = Chirp::vserialize(NULL, (uint8_t *)rec+offset, PRM_MAX_LEN-offset, &args);
    va_end(args);

	if (len<0)
		return -3;

	rec->flags = flags;
	rec->len = len;
	rec->crc = prm_crc(rec); 

	if ((freeLoc=prm_nextFree())==NULL)
		return -4;
	
	return flash_program(freeLoc, (uint8_t *)rec, len+prm_getDataOffset(rec));	
}
Beispiel #7
0
int32_t prm_getChirp(const char *id, Chirp *chirp)
{
	ParamRecord *rec;

	Shadow *shadow = prm_findShadow(id);

	if (shadow && shadow->data)
		CRP_RETURN(chirp, UINTS8(shadow->len, shadow->data), END);
	else
	{
		rec = prm_find(id);
		if (rec==NULL)
			return -1;
	
		CRP_RETURN(chirp, UINTS8(rec->len, (uint8_t *)rec+prm_getDataOffset(rec)), END);
	}

	return 0;
}
Beispiel #8
0
int32_t prm_setChirp(const char *id, const uint32_t &valLen, const uint8_t *val)
{
	ParamRecord *rec;
	uint8_t *buf;
	uint32_t offset;
	void *sector;

	buf = (uint8_t *)malloc(FLASH_SECTOR_SIZE);

	if (buf==NULL)
		return -2;

	rec = prm_find(id);

	if (rec==NULL)
		return -1;

	sector = (void *)FLASH_SECTOR_MASK((uint32_t)rec);
	memcpy(buf, sector, FLASH_SECTOR_SIZE);

	rec = prm_find(id, buf);

	if (rec==NULL)
		return -1;

	offset = prm_getDataOffset(rec);	
	memcpy((uint8_t *)rec+offset, val, valLen);
	 	
	rec->len = valLen;
	rec->crc = prm_crc(rec);
	
	flash_erase((uint32_t)sector, FLASH_SECTOR_SIZE); 
	flash_program((uint32_t)sector, buf, FLASH_SECTOR_SIZE);

	free(buf); 	
	return 0;
}
Beispiel #9
0
int32_t  prm_getAll(const uint16_t &index, Chirp *chirp)
{
	uint16_t i;
	ParamRecord *rec;

	for (i=0, rec=(ParamRecord *)PRM_FLASH_LOC; rec->crc!=0xffff && rec<(ParamRecord *)PRM_ENDREC; i++, rec++)
	{
		if(i==index)
		{
			CRP_RETURN(chirp, STRING(prm_getId(rec)), STRING(prm_getDesc(rec)),  UINTS8(rec->len, (uint8_t *)rec+prm_getDataOffset(rec)));
			return 0;
		}
	}
	return -1;	
}