Page MenuHomec4science

register.c
No OneTemporary

File Metadata

Created
Sun, Oct 6, 20:29

register.c

#include <p33Fxxxx.h>
#include <sbcp-uc/register.h>
#include <sbcp-uc/buffers.h>
enum sbcp_reg_persistent_state {
SBCP_REG_P_UNDECIDED,
SBCP_REG_P_ALREADY_SET,
SBCP_REG_P_TO_SET
};
enum sbcp_reg_persistent_state sbcp_reg_p_state = SBCP_REG_P_UNDECIDED;
sbcp_reg_val _NEAR sbcp_reg_table[SBCP_REG_TABLE_SIZE];
sbcp_reg_ctrl_params _NEAR sbcp_reg_params[SBCP_REG_TABLE_SIZE];
void set_volatile_register(sbcp_reg_address address,
uint16_t value){
sbcp_reg_table[address].u = value;
}
void set_persistent_register(sbcp_reg_address address,
uint16_t value){
unsigned int in_eeprom = DataEERead(address);
if(sbcp_reg_p_state == SBCP_REG_P_UNDECIDED){
if(in_eeprom == 0xffff && GetaddrNotFound()){
sbcp_reg_p_state = SBCP_REG_P_TO_SET;
} else {
sbcp_reg_p_state = SBCP_REG_P_ALREADY_SET;
}
}
if(sbcp_reg_p_state == SBCP_REG_P_ALREADY_SET){
sbcp_reg_table[address].u = in_eeprom;
return;
} else if(sbcp_reg_p_state == SBCP_REG_P_TO_SET){
sbcp_reg_table[address].u = value;
DataEEWrite(value,address);
}
}
void sbcp_add_register_private(sbcp_reg_address address,
uint16_t value,
sbcp_reg_flags flags,
sbcp_reg_host_wr_callback clb){
if(flags & SBCP_REG_PERSISTENT){
set_persistent_register(address,value);
} else {
set_volatile_register(address,value);
}
sbcp_reg_flags(address) = flags & SBCP_REG_USER_SETABLE_FLAGS;
if(flags & SBCP_REG_WRITABLE) {
sbcp_reg_clbck(address) = clb;
} else {
sbcp_reg_clbck(address) = SBCP_REG_NO_CALLBACK;
}
}
sbcp_error sbcp_id_register_callback(sbcp_reg_address address, sbcp_reg_val * val){
if(address != SBCP_REG_ID){
return SBCP_CERR_REG_PROTECTED;
}
val->u &= 0x00ff;
init_buffers(SBCP_MY_CLASS,val->u);
return SBCP_NO_ERROR;
}
void sbcp_add_register(sbcp_reg_address address,
uint16_t value,
sbcp_reg_flags flags,
sbcp_reg_host_wr_callback clb){
if(address >= SBCP_REG_TABLE_SIZE){
return;
}
if(address < SBCP_SPECIFIC_REG_START){
return;
}
sbcp_add_register_private(address,value,flags,clb);
}
void sbcp_add_register_no_callback(sbcp_reg_address address,
uint16_t value,
sbcp_reg_flags flags){
sbcp_add_register(address, value, flags , SBCP_REG_NO_CALLBACK);
}
void sbcp_init_registers(sbcp_class klass,
sbcp_id id,
sbcp_fw_version version,
sbcp_init_device_registers_fptr device_specific_init){
unsigned int i;
for(i = 0 ; i < SBCP_REG_TABLE_SIZE; ++i){
sbcp_reg_table[i].i = 0;
sbcp_reg_params[i].flags = SBCP_REG_UNIMPLEMENTED;
sbcp_reg_params[i].callback = SBCP_REG_NO_CALLBACK;
}
if(DataEEInit()){
return;
}
dataEEFlags.val = 0;
sbcp_add_register_private(SBCP_REG_FW,
version,
SBCP_REG_READABLE | SBCP_REG_PERSISTENT,
SBCP_REG_NO_CALLBACK);
sbcp_add_register_private(SBCP_REG_CLASS,
klass,
SBCP_REG_READABLE | SBCP_REG_PERSISTENT,
SBCP_REG_NO_CALLBACK);
sbcp_add_register_private(SBCP_REG_ID,
id,
SBCP_REG_READABLE | SBCP_REG_WRITABLE | SBCP_REG_PERSISTENT,
&sbcp_id_register_callback);
if(device_specific_init != (void*)0){
(*device_specific_init)();
}
}

Event Timeline