bool device_db_compile(struct fs_file * json) { struct fs_dirent entry; unsigned int offs; unsigned int size; struct db_cfg db; /* initialize database stack */ db_stack = DB_STACK_LIMIT; memset(&db, 0, sizeof(struct db_cfg)); if (db_json_parse(json, &db) < 0) { DCC_LOG(LOG_ERROR, "db_json_parse() failed."); return false; } fs_dirent_get(&entry, FLASHFS_DB_BIN); /* reserve space for the file entry */ offs = entry.blk_offs + sizeof(struct fs_file); if (db_info_write(offs, json, &db) < 0) return false; size = db_stack - sizeof(struct fs_file); return fs_file_commit(&entry, size); }
void db_cfg_purge(void) { struct fs_dirent entry; /* uncofigure all devices */ dev_sim_uncofigure_all(); /* Erase database */ fs_dirent_get(&entry, FLASHFS_DB_BIN); fs_file_unlink(&entry); /* Erase config */ fs_dirent_get(&entry, FLASHFS_CFG_BIN); fs_file_unlink(&entry); /* Erase strings */ const_strbuf_purge(); /* Initialize symbol table */ symtab_init(slcdev_symbuf, sizeof(slcdev_symbuf)); }
struct db_info * db_info_get(void) { struct fs_dirent entry; struct db_info * inf; fs_dirent_get(&entry, FLASHFS_DB_BIN); if (entry.fp->size == 0) return NULL; inf = (struct db_info *)(entry.fp->data); if (inf->magic != DB_BLK_MAGIC) return NULL; return inf; }
int cmd_config(FILE * f, int argc, char ** argv) { bool xfer = false; bool erase = false; bool compile = false; bool load = false; bool restart = false; int i; if (argc == 1) { fprintf(f, "Simulation Configuration:\n"); return config_show_info(f); } for (i = 1; i < argc; ++i) { if ((strcmp(argv[i], "compile") == 0) || (strcmp(argv[i], "c") == 0)) { erase = true; compile = true; } else if ((strcmp(argv[i], "erase") == 0) || (strcmp(argv[i], "e") == 0)) { erase = true; } else if ((strcmp(argv[i], "load") == 0) || (strcmp(argv[i], "l") == 0)) { load = true; } else if ((strcmp(argv[i], "xfer") == 0) || (strcmp(argv[i], "x") == 0)) { xfer = true; erase = true; compile = true; } else return SHELL_ERR_ARG_INVALID; } if (xfer) { slcdev_stop(); fprintf(f, "XMODEM receive: '%s'... ", "cfg.js"); if ((fs_xmodem_recv(f, "cfg.js")) < 0) { fprintf(f, "fs_xmodem_recv() failed!\r\n"); return -1; } fprintf(f, "\n"); } if (erase) { struct fs_dirent bin; fprintf(f, "Erasing...\n"); fs_dirent_get(&bin, FLASHFS_CFG_BIN); fs_file_unlink(&bin); } if (compile) { struct fs_dirent json; fs_dirent_get(&json, FLASHFS_CFG_JSON); if (config_is_sane() && !config_need_update(json.fp)) { fprintf(f, "Up-to-date.\n"); } else { struct microjs_rt * rt; slcdev_stop(); fprintf(f, "Compiling...\n"); if (config_compile(json.fp) < 0) { struct fs_dirent bin; fprintf(f, "# Error!\n"); /* purge the invalid config */ fs_dirent_get(&bin, FLASHFS_CFG_BIN); fs_file_unlink(&bin); return -1; } if (SLCDEV_VERBOSE()) { rt = symtab_rt_get((struct symtab *)slcdev_symbuf); fprintf(f, " - data: %d of %d\n", rt->data_sz, sizeof(slcdev_vm_data)); fprintf(f, " - stack: %d of %d\n", rt->stack_sz, sizeof(slcdev_vm_stack)); } fprintf(f, "Saving...\n"); if (config_save(json.fp) < 0) { fprintf(f, "# Error!\n"); return -1; } restart = true; } config_show_info(f); } if (load) { fprintf(f, "Loading...\n"); slcdev_stop(); if (config_load() < 0) { fprintf(f, "# Error!\n"); return -1; } restart = true; } if (restart) { /* restart simulation */ slcdev_event_raise(SLC_EV_SIM_START); } return 0; }
int cmd_dbase(FILE * f, int argc, char ** argv) { struct fs_dirent entry; bool erase = false; bool compile = false; bool xfer = false; bool dump = false; int i; if (argc == 1) { fprintf(f, "Device Model Database:\n"); return device_db_info(f); } for (i = 1; i < argc; ++i) { if ((strcmp(argv[i], "compile") == 0) || (strcmp(argv[i], "c") == 0)) { compile = true; erase = true; } else if ((strcmp(argv[i], "erase") == 0) || (strcmp(argv[i], "e") == 0)) { erase = true; } else if ((strcmp(argv[i], "xfer") == 0) || (strcmp(argv[i], "x") == 0)) { xfer = true; erase = true; compile = true; } else if ((strcmp(argv[i], "dump") == 0) || (strcmp(argv[i], "d") == 0)) { dump = true; } else return SHELL_ERR_ARG_INVALID; } slcdev_stop(); if (xfer) { fprintf(f, "XMODEM receive: '%s'... ", "db.js"); if ((fs_xmodem_recv(f, "db.js")) < 0) { fprintf(f, "fs_xmodem_recv() failed!\r\n"); return -1; } fprintf(f, "\n"); } if (erase) { fprintf(f, "Erasing DB...\n"); db_cfg_purge(); } if (compile) { fs_dirent_get(&entry, FLASHFS_DB_JSON); if (!device_db_need_update(entry.fp)) { fprintf(f, "Up-to-date.\n"); } else { struct microjs_rt * rt; fprintf(f, "Compiling...\n"); if (!device_db_compile(entry.fp)) { printf("Parse error!\n"); return -1; } if (SLCDEV_VERBOSE()) { rt = symtab_rt_get((struct symtab *)slcdev_symbuf); fprintf(f, " - data: %d of %d\n", rt->data_sz, sizeof(slcdev_vm_data)); fprintf(f, " - stack: %d of %d\n", rt->stack_sz, sizeof(slcdev_vm_stack)); } } device_db_info(f); } if (dump) device_db_dump(f); return 0; }