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; }
int prm_setShadowCallback(const char *id, ShadowCallback callback) { Shadow shadow, *pshadow; // can't create a shadow if it doesn't exist if (prm_find(id)==NULL) return -1; pshadow = prm_findShadow(id); if (pshadow) // shadow is already in the table pshadow->callback = callback; else // create new entry { uint32_t len = strlen(id)+1; shadow.id = (const char *)malloc(len); strcpy((char *)shadow.id, id); shadow.len = 0; shadow.data = NULL; shadow.callback = callback; g_shadowTable.push_back(shadow); } return 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; }
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; }
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; }
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)); }
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; }