Exemple #1
0
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);
}
Exemple #2
0
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));
}
Exemple #3
0
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;
}
Exemple #4
0
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;
}
Exemple #5
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;
}