Esempio n. 1
0
void world_tree_remove_app(graph_view_handle view, uint64_t id)
{
  GtkTreeIter view_iter;
  GtkTreeIter app_iter;
  const char * view_name;
  const char * app_name;
  GtkTreePath * path;

  if (!find_app(view, id, &view_iter, &app_iter))
  {
    log_error("removed app not found");
    return;
  }

  path = gtk_tree_model_get_path(GTK_TREE_MODEL(g_treestore), &view_iter);

  gtk_tree_model_get(GTK_TREE_MODEL(g_treestore), &view_iter, COL_NAME, &view_name, -1);
  gtk_tree_model_get(GTK_TREE_MODEL(g_treestore), &app_iter, COL_NAME, &app_name, -1);

  log_info("removing app '%s' from '%s'", app_name, view_name);

  gtk_tree_view_expand_row(GTK_TREE_VIEW(g_world_tree_widget), path, false);
  gtk_tree_store_remove(g_treestore, &app_iter);

  gtk_tree_path_free(path);
}
Esempio n. 2
0
int
print_all_timers(dldev_t *dev, char *file)
{
	FILE *fp;
	int i;
	u16 add_addr, o;
	timer_rec_t rec;
	u8 at_end, num_recs;

	/* find the application */
	if((i = find_app(dev, app_name)) < 0){
		ERROR("%s application not found", app_name);
		return -1;
	}

	if(!(fp = fopen(file, "w"))){
		ERROR("%s: open failed", file);
		return -1;
	}

	/* application database data */
	add_addr = dev->app[i].acb.add_addr;
	/* number of records */
	if(read_abs_addr(dev, add_addr+5, ext_mem, (u8 *)&num_recs, 1)){
		ERROR("read_abs_addr");
		return -1;
	}

	if(!is_countdn){
		if(read_abs_addr(dev, add_addr+8, ext_mem, (u8 *)&at_end, 1)){
			ERROR("read_abs_addr");
			return -1;
		}
		fprintf(fp, "%s\n", timer_at_end[at_end]);
	}

	o = header_size;
	for(i = 0; i < num_recs; i++){
		if(read_abs_addr(dev, add_addr+o+13*i, ext_mem, (u8 *)&rec,
					13)){
			ERROR("read_abs_addr");
			return -1;
		}
		print_rdm(rec.msg, 9, fp);
		fprintf(fp, "\t%02d:%02d:%02d", debcd(rec.hours),
				debcd(rec.minutes), debcd(rec.seconds));
		if(is_countdn)
			fprintf(fp, "\t%s", timer_at_end[rec.at_end]);
		if(rec.halfway_reminder)
			fprintf(fp, "\thalfway reminder");
		fprintf(fp, "\n");
	}

	fclose(fp);

	return 0;
}
Esempio n. 3
0
gboolean
gst_packages_install (GtkWindow   *window,
		      const gchar *packages[])
{
  gchar *path;
  pid_t pid;
  gboolean retval = FALSE;

  g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);

  if (!find_app (window, "synaptic") || !find_app (window, "gksudo"))
    return FALSE;

  path = create_temp_file (packages);

  if (spawn_synaptic (window, path, &pid))
    retval = wait_for_synaptic (window, pid);

  unlink (path);
  g_free (path);

  return retval;
}
Esempio n. 4
0
/* too slow */
int
read_timer_mem(dldev_t *dev, tymer_t *db)
{
	int i, j;
	u16 add_addr, o;
	timer_rec_t *rec;

	/* find the application */
	if((i = find_app(dev, app_name)) < 0){
		ERROR("%s application not found", app_name);
		return -1;
	}

	/* application database data */
	add_addr = dev->app[i].acb.add_addr;
	/* allocation size */
	o = header_size;
	if(read_abs_addr(dev, add_addr, ext_mem, (u8 *)&db->hdr, o)){
		ERROR("read_abs_addr");
		return -1;
	}

	db->head = db->tail = NULL;
	for(i = 0; i < db->hdr.num_recs; i++){
		rec = (timer_rec_t *)malloc(sizeof(timer_rec_t));
		if(read_abs_addr(dev, add_addr+o+13*i, ext_mem, (u8 *)rec, 13)){
			ERROR("read_abs_addr");
			return -1;
		}
		/* TODO: Timex software bug?  Some character values are
		 * unpredictably greater than 0x69 and it should be & ~(1 << 7)
		 * to be compared with dl's index. */
		for(j = 0; j < 9; j++)
			rec->msg[j] &= ~(1 << 7);

		rec->prev = rec->next = NULL;
		if(db->head){
			rec->prev = db->tail;
			db->tail->next = rec;
			db->tail = rec;
		}else
			db->head = db->tail = rec;
	}

	return 0;
}
Esempio n. 5
0
void world_tree_app_state_changed(graph_view_handle view, uint64_t id, const char * app_name, bool running, bool terminal, const char * level)
{
  GtkTreeIter view_iter;
  GtkTreeIter app_iter;
  const char * view_name;
  GtkTreePath * path;
  char * app_name_with_status;

  if (!find_app(view, id, &view_iter, &app_iter))
  {
    log_error("removed app not found");
    return;
  }

  path = gtk_tree_model_get_path(GTK_TREE_MODEL(g_treestore), &view_iter);

  gtk_tree_model_get(GTK_TREE_MODEL(g_treestore), &view_iter, COL_NAME, &view_name, -1);

  log_info("changing app state '%s':'%s'", view_name, app_name);

  app_name_with_status = get_app_name_string(app_name, running, terminal, level);
  if (app_name_with_status == NULL)
  {
    goto free_path;
  }

  gtk_tree_view_expand_row(GTK_TREE_VIEW(g_world_tree_widget), path, false);
  gtk_tree_store_set(
    g_treestore,
    &app_iter,
    COL_NAME, app_name_with_status,
    COL_RUNNING, running,
    COL_TERMINAL, terminal,
    COL_LEVEL, level,
    -1);

  free(app_name_with_status);
free_path:
  gtk_tree_path_free(path);
}
int
main(int argc, char *argv[])
{
	int ret = 1, i, idx;
	dldev_t dev;
	tymer_t db;
	u8 *data;
	u16 len;

	/* for data security */
	/*
	umask(S_IRWXG | S_IRWXO);
	*/

	i = strlen(argv[0]) - 1;
	for(; i >= 0 && argv[0][i] != '/'; i--);
	i++;
	if(strstr(argv[0] + i, "interval")){
		set_timer(POR_INTERVAL);
		is_countdn = 0;
	}

	while((i = getopt(argc, argv, "hd:")) != -1){
		switch(i){
		case 'd':
			dev_file = optarg;
			break;
		case 'h':
		default:
			usage();
			break;
		}
	}
	argc -= optind;
	argv += optind;

#ifdef USB_USBHID
	dev.usb.file = dev_file;
#endif

	if(open_dev(&dev)){
		ERROR("open_dev");
		goto exit;
	}

	if(start_session(&dev)){
		ERROR("read_app_info");
		goto exit;
	}

/******************************************************************************/
#ifdef DEBUG
	for(i = 0; i < NUM_APPS; i++){
		if(!dev.app[i].acd.app_idx)
			continue;
		printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i,
				dev.app[i].acd.app_idx,
				dev.app[i].acd.code_loc,
				dev.app[i].acd.db_loc,
				dev.app[i].acd.code_invalid,
				dev.app[i].acd.db_modified,
				dev.app[i].acd.db_invalid,
				dev.app[i].acd.passwd_req,
				dev.app[i].acd.mode_name,

				dev.app[i].acb.app_type,
				dev.app[i].acb.app_inst,
				dev.app[i].acb.asd_addr,
				dev.app[i].acb.add_addr,
				dev.app[i].acb.state_mgr_addr,
				dev.app[i].acb.refresh_addr,
				dev.app[i].acb.banner_addr,
				dev.app[i].acb.code_addr,
				dev.app[i].banner
		);
	}
#endif
/******************************************************************************/

	if((idx = find_app(&dev, uapp_name)) < 0){
		ERROR("%s application not found", uapp_name);
		goto end;
	}

	if(dump_add(&dev, idx, &data, &len)){
		ERROR("dump_add");
		goto end;
	}
	read_timer(&db, data);
	free(data);

	print_timer(&db, stdout);
	free_timer(&db);

/******************************************************************************/
end:
	if(end_session(&dev)){
		ERROR("end_session");
		goto exit;
	}

	ret = 0;
exit:
	close_dev(&dev);

	exit(ret);
}
Esempio n. 7
0
int
main(int argc, char *argv[])
{
	int ret = 1, i;
	dldev_t dev;
	note_t db;
	u8 *data;
	u16 len;

	/* for data security */
	/*
	umask(S_IRWXG | S_IRWXO);
	*/

	while((i = getopt(argc, argv, "hd:u:e:")) != -1){
		switch(i){
		case 'd':
			dev_file = optarg;
			break;
		case 'u':
			unused_recs = atoi(optarg);
			if(unused_recs < 0)
				unused_recs = 0;
			break;
		case 'e':
			extra_msg_len = atoi(optarg);
			if(extra_msg_len < 0)
				extra_msg_len = 0;
			break;
		case 'h':
		default:
			usage();
			break;
		}
	}
	argc -= optind;
	argv += optind;

	set_note_unused_recs(unused_recs);
	set_note_extra_len(extra_msg_len);

#ifdef USB_USBHID
	dev.usb.file = dev_file;
#endif

	if(open_dev(&dev)){
		ERROR("open_dev");
		goto exit;
	}

	if(start_session(&dev)){
		ERROR("read_app_info");
		goto exit;
	}

/******************************************************************************/
#ifdef DEBUG
	for(i = 0; i < NUM_APPS; i++){
		if(!dev.app[i].acd.app_idx)
			continue;
		printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i,
				dev.app[i].acd.app_idx,
				dev.app[i].acd.code_loc,
				dev.app[i].acd.db_loc,
				dev.app[i].acd.code_invalid,
				dev.app[i].acd.db_modified,
				dev.app[i].acd.db_invalid,
				dev.app[i].acd.passwd_req,
				dev.app[i].acd.mode_name,

				dev.app[i].acb.app_type,
				dev.app[i].acb.app_inst,
				dev.app[i].acb.asd_addr,
				dev.app[i].acb.add_addr,
				dev.app[i].acb.state_mgr_addr,
				dev.app[i].acb.refresh_addr,
				dev.app[i].acb.banner_addr,
				dev.app[i].acb.code_addr,
				dev.app[i].banner
		);
	}
#endif
/******************************************************************************/

	if(read_note_mem(&dev, &db)){
		ERROR("read_note_mem");
		goto end;
	}

	create_note(&db, &data, &len);
	if(load_add(&dev, find_app(&dev, "NOTE"), data)){
		ERROR("load_add");
		goto end;
	}
	free(data);

	print_note(&db, stdout);
	free_note(&db);

/******************************************************************************/
end:
	if(end_session(&dev)){
		ERROR("end_session");
		goto exit;
	}

	ret = 0;
exit:
	close_dev(&dev);

	exit(ret);
}
Esempio n. 8
0
int
main(int argc, char *argv[])
{
	int ret = 1, istty, i, idx;
	char *msg = NULL, *timer = NULL, *at_end = NULL, *halfway = NULL;
	dldev_t dev;
	tymer_t db;
	u8 *data;
	u16 len;

	/* for data security */
	/*
	umask(S_IRWXG | S_IRWXO);
	*/

	istty = isatty(0);

	i = strlen(argv[0]) - 1;
	for(; i >= 0 && argv[0][i] != '/'; i--);
	i++;
	if(strstr(argv[0] + i, "interval")){
		set_timer(POR_INTERVAL);
		is_countdn = 0;
	}

	while((i = getopt(argc, argv, "hd:")) != -1){
		switch(i){
		case 'd':
			dev_file = optarg;
			break;
		case 'h':
		default:
			usage();
			break;
		}
	}
	argc -= optind;
	argv += optind;

#ifdef USB_USBHID
	dev.usb.file = dev_file;
#endif

	BEGIN_OPT()
		OPT("msg", msg)
		OPT("timer", timer)
		OPT("at_end", at_end)
		OPT("halfway", halfway)
	END_OPT()

	/* allows the user to change only at_end in interval timer */
	if(istty && ((!msg || !timer) && (is_countdn || !at_end)))
		usage();

	if(open_dev(&dev)){
		ERROR("open_dev");
		goto exit;
	}

	if(start_session(&dev)){
		ERROR("read_app_info");
		goto exit;
	}

/******************************************************************************/
#ifdef DEBUG
	for(i = 0; i < NUM_APPS; i++){
		if(!dev.app[i].acd.app_idx)
			continue;
		printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i,
				dev.app[i].acd.app_idx,
				dev.app[i].acd.code_loc,
				dev.app[i].acd.db_loc,
				dev.app[i].acd.code_invalid,
				dev.app[i].acd.db_modified,
				dev.app[i].acd.db_invalid,
				dev.app[i].acd.passwd_req,
				dev.app[i].acd.mode_name,

				dev.app[i].acb.app_type,
				dev.app[i].acb.app_inst,
				dev.app[i].acb.asd_addr,
				dev.app[i].acb.add_addr,
				dev.app[i].acb.state_mgr_addr,
				dev.app[i].acb.refresh_addr,
				dev.app[i].acb.banner_addr,
				dev.app[i].acb.code_addr,
				dev.app[i].banner
		);
	}
#endif
/******************************************************************************/

	if((idx = find_app(&dev, uapp_name)) < 0){
		ERROR("%s application not found", uapp_name);
		goto end;
	}

	if(dump_add(&dev, idx, &data, &len)){
		ERROR("dump_add");
		goto end;
	}
	read_timer(&db, data);
	free(data);

	if(!istty)
		add_timer_file(&db, stdin);

	if(msg && timer){
		char buf[BUFSIZ];
		timer_data_t rec;

		sprintf(buf, "%s\t%s\t%s%s", msg, timer,
			(at_end ? at_end : "stop"),
			(halfway && strcmp(halfway, "no") ? "\thalfway" : ""));
		if(read_timer_line(&rec, buf))
			fprintf(stderr, "add_%s: format error!\n", lapp_name);
		else
		if(find_timer(&db, &rec) < 0)
			add_timer(&db, &rec);
	}
	if(!is_countdn && at_end){
		int i;

		for(i = 0; i < 3 && strcmp(at_end, timer_at_end[i]); i++);
		if(i < 3){
			set_timer_at_end(i);
			update_timer_at_end(&db);
		}
	}

	create_timer(&db, &data, &len);
	if(load_add(&dev, idx, data)){
		ERROR("load_add");
		goto end;
	}
	free(data);

	print_timer(&db, stdout);
	free_timer(&db);

/******************************************************************************/
end:
	if(end_session(&dev)){
		ERROR("end_session");
		goto exit;
	}

	ret = 0;
exit:
	close_dev(&dev);

	exit(ret);
}
Esempio n. 9
0
int
main(int argc, char *argv[])
{
	int ret = 1, i, idx, fd, num_apps = 0;
	char *dev_file = "/dev/uhid0", *banner, *file;
	dldev_t dev;
	appinfo *app = NULL;
	u8 *data;
	u16 len;

	/* for data security */
	/*
	umask(S_IRWXG | S_IRWXO);
	*/

	while((i = getopt(argc, argv, "hd:")) != -1){
		switch(i){
		case 'd':
			dev_file = optarg;
			break;
		case 'h':
		default:
			usage();
			break;
		}
	}
	argc -= optind;
	argv += optind;

#ifdef USB_USBHID
	dev.usb.file = dev_file;
#endif

	BEGIN_OPT()
		APP_OPT("rom", -3)
		APP_OPT("eeprom", -2)
		APP_OPT("wristapp", -1)
		APP_OPT("contact", APP_CONTACT)
		APP_OPT("note", APP_NOTE)
		APP_OPT("appt", APP_APPT)
		APP_OPT("alarm", APP_ALARM)
		APP_OPT("schedule", APP_SCHEDULE)
		APP_OPT("occasion", APP_OCCASION)
		APP_OPT("chrono", APP_CHRONO)
		APP_OPT("countdn", APP_TIMER)
		APP_OPT("interval", APP_TIMER | 0x100)
#if 0
		APP_OPT("synchro", APP_SYNCHRO)
#endif
		APP_OPT("option", APP_OPTION)
	END_OPT()

	if(!num_apps)
		usage();

	if(open_dev(&dev)){
		ERROR("open_dev");
		goto exit;
	}

	tucp_progress(1);

	if(start_session(&dev)){
		ERROR("read_app_info");
		goto exit;
	}

/******************************************************************************/
#ifdef DEBUG
	for(i = 0; i < NUM_APPS; i++){
		if(!dev.app[i].acd.app_idx)
			continue;
		printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i,
				dev.app[i].acd.app_idx,
				dev.app[i].acd.code_loc,
				dev.app[i].acd.db_loc,
				dev.app[i].acd.code_invalid,
				dev.app[i].acd.db_modified,
				dev.app[i].acd.db_invalid,
				dev.app[i].acd.passwd_req,
				dev.app[i].acd.mode_name,

				dev.app[i].acb.app_type,
				dev.app[i].acb.app_inst,
				dev.app[i].acb.asd_addr,
				dev.app[i].acb.add_addr,
				dev.app[i].acb.state_mgr_addr,
				dev.app[i].acb.refresh_addr,
				dev.app[i].acb.banner_addr,
				dev.app[i].acb.code_addr,
				dev.app[i].banner
		);
	}
#endif
/******************************************************************************/

	for(i = 0; i < num_apps; i++){
		if(app[i].file[0])
			fprintf(stderr, "%s\n", app[i].file);
		else
			continue;

		banner = NULL;
		file = app[i].file;

		switch(app[i].app){
		case -3:
			if(dump_rom(&dev, &data, &len)){
				ERROR("dump_rom");
				goto end;
			}
			break;
		case -2:
			if(dump_eeprom(&dev, &data, &len)){
				ERROR("dump_eeprom");
				goto end;
			}
			break;
		case -1:
			banner = file;
			for(; *file && *file != '='; file++);
			if(*file)
				*file++ = 0;
			if(!(*file)){
				ERROR("%s: no file name specified", banner);
				goto end;
			}
			for(; *banner; banner++)
				*banner = toupper(*banner);
			banner = app[i].file;
			break;
		case APP_CONTACT:
			banner = "CONTACT";
			break;
		case APP_NOTE:
			banner = "NOTE";
			break;
		case APP_APPT:
			banner = "APPT";
			break;
		case APP_ALARM:
			banner = "ALARM";
			break;
		case APP_SCHEDULE:
			banner = "SCHEDULE";
			break;
		case APP_OCCASION:
			banner = "OCCASION";
			break;
		case APP_CHRONO:
			banner = "CHRONO";
			break;
		case APP_TIMER:
			banner = "COUNTDN TIMER";
			break;
		case APP_TIMER | 0x100:
			banner = "INTERVAL TIMER";
			break;
#if 0
		case APP_SYNCHRO:
			banner = "SYNCHRO";
			break;
#endif
		case APP_OPTION:
			len = 15;
			data = (u8 *)malloc(len);
			if(read_abs_addr(&dev, dev.sysmap.opt_addr, int_mem,
						data, len)){
				ERROR("read_abs_addr");
				goto end;
			}
			break;
		}

		if(banner){
			if((idx = find_app(&dev, banner)) < 0){
				ERROR("%s application not found", banner);
				goto end;
			}
			if(dump_add(&dev, idx, &data, &len)){
				ERROR("dump_add");
				goto end;
			}
		}

		if((fd = open(file, O_WRITE, S_IRWUSR)) < 0){
			ERROR("%s: open failed", file);
			goto end;
		}
		if(write(fd, data, len) != len){
			ERROR("%s: write failed", file);
			goto end;
		}
		close(fd);
		free(data);
	}

/******************************************************************************/
end:
	if(end_session(&dev)){
		ERROR("end_session");
		goto exit;
	}

	tucp_progress(0);

	ret = 0;
exit:
	close_dev(&dev);

	exit(ret);
}
Esempio n. 10
0
int
main(int argc, char *argv[])
{
	int ret = 1, istty, i, idx, delete_all = 0, updated = 0;
	dldev_t dev;
	contact_t db;
	contact_data_t rec;
	u8 *data;
	u16 len;

	/* for data security */
	/*
	umask(S_IRWXG | S_IRWXO);
	*/

	istty = isatty(0);

	while((i = getopt(argc, argv, "hd:a")) != -1){
		switch(i){
		case 'd':
			dev_file = optarg;
			break;
		case 'a':
			delete_all = 1;
			break;
		case 'h':
		default:
			usage();
			break;
		}
	}
	argc -= optind;
	argv += optind;

#ifdef USB_USBHID
	dev.usb.file = dev_file;
#endif

	memset(&rec, 0, sizeof(contact_data_t));
	BEGIN_OPT()
		OPT("msg", rec.msg)
		OPT("type", rec.type)
		OPT("area", rec.area)
		OPT("number", rec.number)
	END_OPT()

	if(delete_all){
		fprintf(stderr,
			"WARNING: DELETE ALL CONTACTS IN THE WATCH (Y/N)? ");
		if(tolower(getchar()) != 'y')
			exit(0);
	}else
	if(istty && (!rec.msg || !rec.type || !rec.area || !rec.number))
		usage();

	/* TODO: long phone number extending to the next or previous record */

	if(open_dev(&dev)){
		ERROR("open_dev");
		goto exit;
	}

	if(start_session(&dev)){
		ERROR("read_app_info");
		goto exit;
	}

/******************************************************************************/
#ifdef DEBUG
	for(i = 0; i < NUM_APPS; i++){
		if(!dev.app[i].acd.app_idx)
			continue;
		printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i,
				dev.app[i].acd.app_idx,
				dev.app[i].acd.code_loc,
				dev.app[i].acd.db_loc,
				dev.app[i].acd.code_invalid,
				dev.app[i].acd.db_modified,
				dev.app[i].acd.db_invalid,
				dev.app[i].acd.passwd_req,
				dev.app[i].acd.mode_name,

				dev.app[i].acb.app_type,
				dev.app[i].acb.app_inst,
				dev.app[i].acb.asd_addr,
				dev.app[i].acb.add_addr,
				dev.app[i].acb.state_mgr_addr,
				dev.app[i].acb.refresh_addr,
				dev.app[i].acb.banner_addr,
				dev.app[i].acb.code_addr,
				dev.app[i].banner
		);
	}
#endif
/******************************************************************************/

	if((idx = find_app(&dev, "CONTACT")) < 0){
		ERROR("CONTACT application not found");
		goto end;
	}

	if(dump_add(&dev, idx, &data, &len)){
		ERROR("dump_add");
		goto end;
	}

	read_contact(&db, data);
	free(data);

	if(delete_all){
		while(!del_contact(&db, 0))
			updated = 1;
	}else{
		if(!istty && !del_contact_file(&db, stdin))
			updated = 1;

		if(rec.msg && rec.type && rec.area && rec.number &&
			(i = find_contact(&db, &rec)) >= 0 &&
			!del_contact(&db, i))
			updated = 1;
	}

	if(updated){
		create_contact(&db, &data, &len);
		if(load_add(&dev, idx, data)){
			ERROR("load_add");
			goto end;
		}
		free(data);
	}

	print_contact(&db, stdout);
	free_contact(&db);

/******************************************************************************/
end:
	if(end_session(&dev)){
		ERROR("end_session");
		goto exit;
	}

	ret = 0;
exit:
	close_dev(&dev);

	exit(ret);
}
Esempio n. 11
0
int
print_all_schedules(dldev_t *dev, char *file)
{
	FILE *fp;
	int i, j;
	u16 add_addr, offset, offset2;
	schedule_hdr_t hdr;
	schedule_grp_hdr_t grp_hdr;
	schedule_rec_t rec;
	u8 grp[101], msg[101];

	/* find the application */
	if((i = find_app(dev, "SCHEDULE")) < 0){
		ERROR("SCHEDULE application not found");
		return -1;
	}

	if(!(fp = fopen(file, "w"))){
		ERROR("%s: open failed", file);
		return -1;
	}

	/* application database data */
	add_addr = dev->app[i].acb.add_addr;
	if(read_abs_addr(dev, add_addr, ext_mem, (u8 *)&hdr, 27)){
		ERROR("read_abs_addr");
		return -1;
	}
	print_rdm(hdr.msg, hdr.msg_len, fp);
	fprintf(fp, "\t%s\n", get_schedule_grp_type_str(hdr.grp_type));

	for(i = 0; i < hdr.num_grps; i++){
		if(read_abs_addr(dev, add_addr+5+22+2*i, ext_mem, (u8 *)&offset,
					2)){
			ERROR("read_abs_addr");
			return -1;
		}
		offset += add_addr + 27;
		if(read_abs_addr(dev, offset, ext_mem, (u8 *)&grp_hdr, 8)){
			ERROR("read_abs_addr");
			return -1;
		}
		if(read_abs_addr(dev, offset+8, ext_mem, grp, grp_hdr.msg_len)){
			ERROR("read_abs_addr");
			return -1;
		}

		for(j = 0; j < grp_hdr.num_recs; j++){
			if(read_abs_addr(dev, offset+8+grp_hdr.msg_len+2*j,
						ext_mem, (u8 *)&offset2,
						2)){
				ERROR("read_abs_addr");
				return -1;
			}
			offset2 += offset + 8 + grp_hdr.msg_len;
			if(read_abs_addr(dev, offset2, ext_mem, (u8 *)&rec, 7)){
				ERROR("read_abs_addr");
				return -1;
			}
			if(read_abs_addr(dev, offset2+7, ext_mem, msg,
						rec.msg_len)){
				ERROR("read_abs_addr");
				return -1;
			}

			print_rdm(grp, grp_hdr.msg_len, fp);
			fprintf(fp, "\t");
			print_rdm(msg, rec.msg_len, fp);
			fprintf(fp, "\t");

			switch(hdr.grp_type){
			case date:
				fprintf(fp, "%d-%02d-%02d",
						2000 + debcd(rec.year),
						debcd(rec.month),
						debcd(rec.day));
				break;
			case dow_time:
				fprintf(fp, "%s %02d:%02d",
						schedule_dow[rec.dow],
						debcd(rec.hour),
						debcd(rec.minute));
				break;
			case date_time:
				fprintf(fp, "%d-%02d-%02d %02d:%02d",
						2000 + debcd(rec.year),
						debcd(rec.month),
						debcd(rec.day), debcd(rec.hour),
						debcd(rec.minute));
				break;
			}
			fprintf(fp, "\n");
		}
	}

	fclose(fp);

	return 0;
}
Esempio n. 12
0
/* too slow */
int
read_schedule_mem(dldev_t *dev, schedule_t *db)
{
	int i, j, k;
	u16 add_addr, offset, offset2;
	schedule_grp_t *grp;
	schedule_rec_t *rec;

	/* find the application */
	if((i = find_app(dev, "SCHEDULE")) < 0){
		ERROR("SCHEDULE application not found");
		return -1;
	}

	/* application database data */
	add_addr = dev->app[i].acb.add_addr;
	/* allocation size */
	if(read_abs_addr(dev, add_addr, ext_mem, (u8 *)&db->hdr, 27)){
		ERROR("read_abs_addr");
		return -1;
	}

	db->head = db->tail = NULL;
	for(i = 0; i < db->hdr.num_grps; i++){
		grp = (schedule_grp_t *)malloc(sizeof(schedule_grp_t));
		if(read_abs_addr(dev, add_addr+27+2*i, ext_mem, (u8 *)&offset,
					2)){
			ERROR("read_abs_addr");
			return -1;
		}
		offset += add_addr + 27;
		if(read_abs_addr(dev, offset, ext_mem, (u8 *)&grp->hdr, 8)){
			ERROR("read_abs_addr");
			return -1;
		}
		grp->hdr.msg = (u8 *)malloc(grp->hdr.msg_len);
		if(read_abs_addr(dev, offset+8, ext_mem, grp->hdr.msg,
					grp->hdr.msg_len)){
			ERROR("read_abs_addr");
			return -1;
		}
		/* TODO: Timex software bug?  Some character values are
		 * unpredictably greater than 0x69 and it should be &
		 * ~(1 << 7) to be compared with dl's index. */
		for(k = 0; k < grp->hdr.msg_len; k++)
			grp->hdr.msg[k] &= ~(1 << 7);

		grp->head = grp->tail = NULL;
		for(j = 0; j < grp->hdr.num_recs; j++){
			rec = (schedule_rec_t *)malloc(sizeof(schedule_rec_t));
			if(read_abs_addr(dev, offset+8+grp->hdr.msg_len+2*j,
						ext_mem, (u8 *)&offset2,
						2)){
				ERROR("read_abs_addr");
				return -1;
			}
			offset2 += offset + 8 + grp->hdr.msg_len;
			if(read_abs_addr(dev, offset2, ext_mem, (u8 *)rec, 7)){
				ERROR("read_abs_addr");
				return -1;
			}
			rec->msg = (u8 *)malloc(rec->msg_len);
			if(read_abs_addr(dev, offset2+7, ext_mem, rec->msg,
						rec->msg_len)){
				ERROR("read_abs_addr");
				return -1;
			}
			/* TODO: Timex software bug?  Some character values are
			 * unpredictably greater than 0x69 and it should be &
			 * ~(1 << 7) to be compared with dl's index. */
			for(k = 0; k < rec->msg_len &&
					rec->msg[k] != DM_SENTINEL; k++)
				rec->msg[k] &= ~(1 << 7);
			/* recalculate the length of the message */
			rec->msg_len = k + 1;

			rec->prev = rec->next = NULL;
			if(grp->head){
				rec->prev = grp->tail;
				grp->tail->next = rec;
				grp->tail = rec;
			}else
				grp->head = grp->tail = rec;
		}
		grp->prev = grp->next = NULL;
		if(db->head){
			grp->prev = db->tail;
			db->tail->next = grp;
			db->tail = grp;
		}else
			db->head = db->tail = grp;
	}

	grp_type = db->hdr.grp_type;

	return 0;
}