int device_db_info(FILE * f) { struct db_info * inf; if ((inf = db_info_get()) == NULL) return -1; db_info_dump(f, inf); return 0; }
uint8_t * db_js_lookup(const char * model, const char * jstag) { struct db_dev_model * mdl; struct cmd_list * lst; struct db_info * inf; int tagid; int nmid; int idx; int j; if ((inf = db_info_get()) == NULL) return NULL; DCC_LOG(LOG_TRACE, "1. str_lookup()"); if ((tagid = str_lookup(jstag, strlen(jstag))) < 0) { DCC_LOG(LOG_WARNING, "tag not found!"); return NULL; } DCC_LOG(LOG_TRACE, "2. str_lookup()"); if ((nmid = str_lookup(model, strlen(model))) < 0) { DCC_LOG(LOG_WARNING, "model name not found!"); return NULL; } DCC_LOG(LOG_TRACE, "3. db_dev_model_index_by_name()"); idx = db_dev_model_index_by_name(inf, nmid); if ((mdl = db_dev_model_by_index(inf, idx)) == NULL) { DCC_LOG(LOG_WARNING, "device not found!"); return NULL; } if ((lst = mdl->cmd) == NULL) { DCC_LOG(LOG_WARNING, "command list empty!"); return NULL; } DCC_LOG(LOG_TRACE, "4. lookup..."); for (j = 0; j < lst->cnt; ++j) { struct cmd_entry * cmd = &lst->cmd[j]; if (cmd->tag == tagid) return cmd->code; } DCC_LOG(LOG_WARNING, "command not found!"); return NULL; }
void device_db_init(void) { struct db_info * inf; if ((inf = db_info_get()) == NULL) { /* initialize an empty symbol table */ symtab_init(slcdev_symbuf, sizeof(slcdev_symbuf)); return; } /* initialize the sybol table from the database */ memcpy(slcdev_symbuf, inf->symbuf, inf->symbuf_sz); }
/* check JSON file against database */ bool device_db_need_update(struct fs_file * json) { struct db_info * inf; if ((inf = db_info_get()) == NULL) return true; if ((inf->json.txt != (const char *)json->data) || (inf->json.crc != json->crc) || (inf->json.len != json->size)) { return true; } return false; }
int device_db_dump(FILE * f) { struct db_info * inf; int i; if ((inf = db_info_get()) == NULL) return -1; db_info_dump(f, inf); for (i = 0 ; i < inf->obj_cnt; ++i) { struct db_dev_model * obj = inf->obj[i]; fprintf(f, "%2d - ", i); model_dump(f, obj); } return 0; }
static int shell_pw_sel(FILE * f, int argc, char ** argv, int n) { struct db_dev_model * mod; struct ss_device * dev; int addr; int sel; if (argc < 3) return SHELL_ERR_ARG_MISSING; addr = strtoul(argv[1], NULL, 0); if (addr > 160) return SHELL_ERR_ARG_INVALID; sel = strtoul(argv[2], NULL, 0); if (sel > 16) return SHELL_ERR_ARG_INVALID; dev = sensor(addr); if ((mod = db_dev_model_by_index(db_info_get(), dev->model)) == NULL) return SHELL_ERR_ARG_INVALID; switch (n) { case 1: dev->pw1 = device_db_pw_lookup(mod->pw1, sel); break; case 2: dev->pw2 = device_db_pw_lookup(mod->pw2, sel); break; case 3: dev->pw3 = device_db_pw_lookup(mod->pw3, sel); break; case 4: dev->pw4 = device_db_pw_lookup(mod->pw4, sel); break; case 5: dev->pw5 = device_db_pw_lookup(mod->pw5, sel); break; } return 0; }
/* check database integrity */ bool device_db_is_sane(void) { return (db_info_get() == NULL) ? false : true; }