Esempio n. 1
0
/*!
  \brief open_debug() opens the file for the debugging information log.
  The path defaults to the current working directory.
  */
G_MODULE_EXPORT void open_debug(void)
{
	extern gconstpointer *global_data;
	CmdLineArgs * args = NULL;
	gchar * filename = NULL;
	gchar * tmpbuf = NULL;
	struct tm *tm = NULL;
	time_t *t = NULL;
	gsize count = 0;
	GError *error = NULL;
	const gchar *project = NULL;

	g_mutex_lock(&dbg_mutex);
	args = (CmdLineArgs *)DATA_GET(global_data,"args");
	project = (const gchar *)DATA_GET(global_data,"project_name");
	if (!project)
		project = DEFAULT_PROJECT;

	if(!dbg_file)
	{
		if (!args->dbglog)
			filename = g_build_filename(HOME(), "mtx",project,"debug.log",NULL);
		else
			filename = g_build_filename(HOME(),"mts",args->dbglog,NULL);
		dbg_file = fopen(filename,"w");
		if (dbg_file)
		{
			t = (time_t *)g_malloc(sizeof(time_t));
			time(t);
			tm = localtime(t);
			g_free(t);
			fprintf(dbg_file,_("Logfile opened for appending on %i-%.2i-%i at %.2i:%.2i \n"),1+(tm->tm_mon),tm->tm_mday,1900+(tm->tm_year),tm->tm_hour,tm->tm_min);
		}
		g_free(filename);
	}
	g_mutex_unlock(&dbg_mutex);
}
static bool nearHomePosition(GHOST_TEventNDOFMotionData *ndof, float threshold)
{
	if (threshold == 0.0f) {
		return atHomePosition(ndof);
	}
	else {
#define HOME(foo) (fabsf(ndof->foo) < threshold)
		return HOME(tx) && HOME(ty) && HOME(tz) && HOME(rx) && HOME(ry) && HOME(rz);
#undef HOME
	}
}
Esempio n. 3
0
void save_defaults()
{
	ConfigFile *cfgfile;
	gchar * filename = NULL;
	gchar * tmpbuf = NULL;
	filename = g_build_filename(HOME(),"mtx","default","config", NULL);
	cfgfile = cfg_open_file(filename);
	if (cfgfile)
	{
		tmpbuf = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(gtk_builder_get_object ((GtkBuilder *)DATA_GET(global_data,"builder"), "filechooser_button")));
		if (tmpbuf)
			cfg_write_string(cfgfile, (gchar *)"MTXLoader", (gchar *)"last_file", tmpbuf);
		g_free(tmpbuf);
		cfg_write_file(cfgfile,filename);
		cfg_free(cfgfile);
		g_free(filename);
	}
}
Esempio n. 4
0
void load_defaults()
{
	GtkBuilder *builder = NULL;
	ConfigFile *cfgfile;
	gchar * filename = NULL;
	gchar * tmpbuf = NULL;
	GtkFileFilter *filter = NULL;
	GObject *object = NULL;

	builder = (GtkBuilder *)DATA_GET(global_data,"builder");
	g_return_if_fail(builder);

	filename = g_build_filename(HOME(),"mtx","default","config", NULL);
	cfgfile = cfg_open_file(filename);
	if (cfgfile)
	{
		if(cfg_read_string(cfgfile, (gchar *)"Serial", (gchar *)"override_port", &tmpbuf))
		{
			gtk_entry_set_text(GTK_ENTRY(gtk_builder_get_object (builder, "port_entry")),tmpbuf);
			g_free(tmpbuf);
		}
		if(cfg_read_string(cfgfile, (gchar *)"MTXLoader", (gchar *)"last_file", &tmpbuf))
		{
			gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(gtk_builder_get_object (builder, "filechooser_button")),tmpbuf);
			filter = gtk_file_filter_new();
			gtk_file_filter_add_pattern(filter,"*.s19");
			gtk_file_filter_add_pattern(filter,"*.S19");
			gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(gtk_builder_get_object (builder, "filechooser_button")),filter);

			g_free(tmpbuf);
		}
		object = gtk_builder_get_object(builder,"ms1_rbutton");
		if (G_IS_OBJECT(object))
			OBJ_SET(object,"persona",GINT_TO_POINTER(MS1));
		object = gtk_builder_get_object(builder,"ms2_rbutton");
		if (G_IS_OBJECT(object))
			OBJ_SET(object,"persona",GINT_TO_POINTER(MS2));
		object = gtk_builder_get_object(builder,"freeems_rbutton");
		if (G_IS_OBJECT(object))
			OBJ_SET(object,"persona",GINT_TO_POINTER(FREEEMS));
		cfg_free(cfgfile);
		g_free(filename);
	}
}
Esempio n. 5
0
/*!
 \brief get_file() gets a single file defnied by pathstub, first searching in
 ~/mtx/<PROJECT>+pathstub, and then in $PREFIX/share/MegaTunix/+pathstub,
 \param pathstub is the partial path to filename
 \param extension is the extension wanted..
 \returns filename if found or NULL if not found
 */
gchar * get_file(const gchar *prj, const gchar *pathstub, const gchar *extension)
{
	gchar *filename = NULL;
	gchar *file = NULL;
	const gchar *project = NULL;
	ENTER();
	if (extension)
		file = g_strconcat(pathstub,".",extension,NULL);
	else
		file = g_strdup(pathstub);

	if (prj)
		project = prj;
	else
		project = DEFAULT_PROJECT;

	filename = g_build_filename(HOME(),"mtx",project,file,NULL);
	/*printf("get_file, personal filename is %s\n",filename);*/
	if (g_file_test(filename,(GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)))
	{
		g_free(file);
		EXIT();
		return filename;
	}
	else 
	{
		g_free(filename);
		filename = g_build_filename(MTXSYSDATA,file,NULL);
		/*printf("get_file, system filename is %s\n",filename);*/

		g_free(file);

		if (g_file_test(filename,(GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)))
		{
			EXIT();
			return filename;
		}
		else
			g_free(filename);
	}
	EXIT();
	return NULL;
}
Esempio n. 6
0
void draw_board() {
    int i;
    HOME();
    for (i=0;i<BOARD_WIDTH+1;i++) {
        printf("X");
    }

    GOTO(0, BOARD_HEIGHT+1);
    for (i=0;i<BOARD_WIDTH+1;i++) {
        printf("X");
    }

    for (i=1;i<BOARD_HEIGHT+1;i++) {
        GOTO(0, i);
        printf("X");
        GOTO(BOARD_WIDTH+1, i);
        printf("X");
    }
}
Esempio n. 7
0
/*!
  \brief pops up a Filechooser dialog to select a file
  \param data is a pointer to a MtxFileIO structure which contains important
  bits like the path to start, the filter, default filename and so on
  \see MtxFileIO
  \returns the path to the file or NULL if cancelled
  */
gchar * choose_file(MtxFileIO *data)
{
	GtkWidget *dialog = NULL;
	GtkFileFilter *filter = NULL;
	gchar * path = NULL;
	gchar * defdir = NULL;
	gchar *filename = NULL;
	gchar *tmpbuf = NULL;
	gchar **vector = NULL;
	gint response = 0;
	gboolean res = FALSE;
	guint i = 0;

	if (!GTK_IS_WINDOW(data->parent))
		data->parent = NULL;
	/*
	   printf("choose_file\n");
	   printf("filter %s\n",data->filter);
	   printf("filename %s\n",data->filename);
	   printf("default_path %s\n",data->default_path);
	   printf("title %s\n",data->title);
	   */
	if (!data->project)
		data->project = DEFAULT_PROJECT;

	if (!data->title)
		data->title = g_strdup("Open File");

	if ((data->action == GTK_FILE_CHOOSER_ACTION_OPEN) || 
			(data->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER))
	{
		dialog = gtk_file_chooser_dialog_new(data->title,
				GTK_WINDOW(data->parent),
				data->action,
				GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
				GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
				NULL);
		if ((data->on_top) && (GTK_IS_WIDGET(data->parent)))
			gtk_window_set_transient_for(GTK_WINDOW(gtk_widget_get_toplevel(dialog)),GTK_WINDOW(data->parent));

		if ((data->absolute_path) && (!data->default_path))
			gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog),data->absolute_path);
		else if (data->default_path)
		{
			path = g_build_filename(MTXSYSDATA,data->default_path,NULL);
			gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog),path);
			g_free(path);
		}
	}
	else if (data->action == GTK_FILE_CHOOSER_ACTION_SAVE)
	{
		dialog = gtk_file_chooser_dialog_new(data->title,
				GTK_WINDOW(data->parent),
				data->action,
				GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
				GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
				NULL);	

		if ((data->on_top) && (GTK_IS_WIDGET(data->parent)))
			gtk_window_set_transient_for(GTK_WINDOW(gtk_widget_get_toplevel(dialog)),GTK_WINDOW(data->parent));

		defdir = g_build_filename(HOME(),"mtx",data->project,data->default_path, NULL);
		if (!g_file_test(defdir,G_FILE_TEST_IS_DIR))
			g_mkdir(defdir,0755);
		/* If filename passed check/adj path */
		if (data->filename)
		{
#ifdef __WIN32__	/* Disallows modifying distributed files */
			if (g_strrstr(data->filename,"dist") != NULL)
#else
				if (g_strrstr(data->filename,DATA_DIR) != NULL)
#endif
				{
					vector = g_strsplit(data->filename,PSEP,-1);
					tmpbuf = g_strconcat(defdir,PSEP,vector[g_strv_length(vector)-1],NULL);
					gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),defdir);
					gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),vector[g_strv_length(vector)-1]);
					g_strfreev(vector);
					g_free(tmpbuf);
				}
				else
					gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),data->filename);
		}
		else
		{
			gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),defdir);
			gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), data->default_filename );
		}
		g_free(defdir);

	}
	else
		return NULL;
	/* Add shortcut folders... */
	if (data->shortcut_folders)
	{

		vector = g_strsplit(data->shortcut_folders,",",-1);
		for (i=0;i<g_strv_length(vector);i++)
		{
			path = g_build_filename(MTXSYSDATA,vector[i],NULL);
			gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(dialog),path,NULL);
			g_free(path);
			path = g_build_filename(HOME(),"mtx",data->project,vector[i],NULL);
			gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(dialog),path,NULL);
			g_free(path);
		}
		g_strfreev(vector);
	}
	/* If default path switch to that place */
	if ((data->external_path) && (!(data->default_path)))
	{
		path = g_build_filename(HOME(),"mtx",data->project,data->external_path,NULL);
		if (!g_file_test(path,G_FILE_TEST_IS_DIR))
			g_mkdir(path,0755);
		gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog),path);
		g_free(path);

	}

	/* If filters, assign them */
	if (data->filter)
	{
		vector = g_strsplit(data->filter,",",-1);
		if (g_strv_length(vector)%2 > 0)
			goto afterfilter;
		for (i=0;i<g_strv_length(vector);i+=2)
		{
			filter = gtk_file_filter_new();
			gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter),vector[i]);
			gtk_file_filter_set_name(GTK_FILE_FILTER(filter),vector[i+1]);
			gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter);
		}
		gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog),filter);
		g_strfreev(vector);
	}
afterfilter:
	/* Turn on overwriteconfirmation */
	gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
	g_signal_connect(G_OBJECT(dialog),"confirm-overwrite",
			G_CALLBACK (confirm_overwrite_callback), NULL);
	if (data->action == GTK_FILE_CHOOSER_ACTION_OPEN)
		if (data->default_filename)
			gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(dialog),data->default_filename);

	response = gtk_dialog_run (GTK_DIALOG (dialog));
	if (response == GTK_RESPONSE_ACCEPT)
	{
		tmpbuf = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
		if ((data->action == GTK_FILE_CHOOSER_ACTION_SAVE) && (data->default_extension))
		{
			if(!g_str_has_suffix (tmpbuf,data->default_extension))
				filename = g_strjoin(".",tmpbuf,data->default_extension,NULL);
			else
				filename = g_strdup(tmpbuf);
		}
		else
			filename = g_strdup(tmpbuf);
		g_free(tmpbuf);
	}
	gtk_widget_destroy (dialog);

	return (filename);
}
Esempio n. 8
0
gboolean lookuptable_change(GtkCellRenderer *renderer, gchar *path, gchar * new_text, gpointer data)
{
	GtkListStore *store = NULL;
	GtkTreeIter iter;
	GtkTreeModel *model = data;
	ConfigFile *cfgfile = NULL;
	gchar * int_name = NULL;
	gchar * old = NULL;
	gchar * new_name = NULL;
	gchar ** vector = NULL;
	gboolean restart_tickler = FALSE;
	extern gint realtime_id;
	extern GHashTable *lookuptables;
	extern GAsyncQueue *io_data_queue;
	extern Firmware_Details *firmware;
	gint count = 0;
	LookupTable *lookuptable = NULL;

	/* Get combo box model so we can set the combo to this new value */
	g_object_get(G_OBJECT(renderer),"model",&store,NULL);
	gtk_tree_model_get_iter_from_string(model,&iter,path);
	gtk_tree_model_get(model,&iter,INTERNAL_NAME_COL,&int_name,FILENAME_COL,&old,-1);
	if (g_strcasecmp(old,new_text) == 0) /* If no change, return */
		return TRUE;
	
	if (g_strcasecmp(new_text,"Personal") == 0)
		return TRUE;
	if (g_strcasecmp(new_text,"System") == 0)
		return TRUE;
	if (realtime_id)
	{
		restart_tickler = TRUE;
		stop_tickler(RTV_TICKLER);
		count = 0;
		while ((g_async_queue_length(io_data_queue) > 0) && (count < 30))
		{
			dbg_func(CRITICAL,g_strdup_printf(__FILE__": LEAVE() draining I/O Queue,  current length %i\n",g_async_queue_length(io_data_queue)));
			while (gtk_events_pending())
				gtk_main_iteration();
			count++;
		}

	}
	lookuptable = (LookupTable *)g_hash_table_lookup(lookuptables,int_name);
	if (!lookuptable)
		printf(_("No lookuptable found! expect a crash!!\n"));
	g_free(lookuptable->array); /* Free the old one */
	g_free(lookuptable->filename); /* Free the old one */
	g_free(lookuptable); /* Free the old one */
	get_table(int_name,new_text,NULL); /* Load the new one in it's place */
	gtk_list_store_set(GTK_LIST_STORE(model),&iter, FILENAME_COL, new_text,-1);
	if (restart_tickler)
		start_tickler(RTV_TICKLER);

		cfgfile = cfg_open_file(firmware->profile_filename);
		if (!cfgfile)
			return FALSE;
		g_hash_table_foreach(lookuptables,update_lt_config,cfgfile);
	if (g_strrstr(firmware->profile_filename,".MegaTunix"))
		cfg_write_file(cfgfile, firmware->profile_filename);
	else
	{
		vector = g_strsplit(firmware->profile_filename,PSEP,-1);
		new_name = g_build_filename(HOME(),".MegaTunix",INTERROGATOR_DATA_DIR,"Profiles",vector[g_strv_length(vector)-1],NULL);
		g_strfreev(vector);
		cfg_write_file(cfgfile, new_name);
		g_free(firmware->profile_filename);
		firmware->profile_filename=g_strdup(new_name);
		g_free(new_name);
	}
	cfg_free(cfgfile);
		
	/*printf("internal name %s, old table %s, new table %s\n",int_name,old,new_text);*/
	return TRUE;

}
Esempio n. 9
0
void CTenkeyOpr::Tenkey(void)
{
	BOOL bOff  = (!g_opr.bStop || g_opr.bEmg ||  g_allHome.m_bStartAll);
	     bOff |= (TRUE == g_nv.NDm(tenKeyJog));

	if(TRUE == bOff)
	{
		m_bDisable = TRUE;
		m_tenkey.Disable();
	}
	else
	{
		if(TRUE == g_nv.NDm(tenKeyJog))
		{
			m_bDisable = TRUE;
			m_tenkey.Disable();
		}
		else if(TRUE == m_bDisable)
		{
			m_bDisable = FALSE;
			m_tenkey.Reset();
		}
	}

	int nTenkeyNo = m_tenkey.GetTenKeyNo();

	//screen tenkey »ç¿ë
	if(nTenkeyNo == NO_KEY && !bOff)
	{
		if(0 < g_nv.NDm(screenTenkey))
		{
			nTenkeyNo = g_nv.NDm(screenTenkey);
		}

		if(99 == nTenkeyNo)
		{
			if(g_allHome.m_bStartAll)
			{
				nTenkeyNo = NO_KEY;
				g_nv.NDm(screenTenkey) = NO_KEY;
			}
		}
	}

	g_nv.NDm(screenTenkey) = NO_KEY;

	if(bOff ||  g_allHome.m_bStartAll || g_opr.bCycleProgress || g_opr.bPaused)
		return;


	if(FALSE == DoorSafety(nTenkeyNo))
	{
		nTenkeyNo = NO_KEY;
	}


	switch(nTenkeyNo)
	{

	//////////////////////////////////////////////////////////////////////////
	// LOADER M/Z PART
	case HOME(1): // Home
		if(AOn(i1stRailFrontStripChk1) || AOn(i1stRailRearStripChk1))
		{
			g_err.Save(WR_INRAIL_JAM);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_LOADER_ELV))
		{
			g_LdMz.m_pMtTrf->CancelHomeSearch();
			g_LdMz.m_pMtElv->CancelHomeSearch();
		}
		break;

	case STEP(1): // Step Cycle
		g_LdInTopConv.m_nRun = mcSTEP;
		g_LdInMidConv.m_nRun = mcSTEP;
		g_LdOutConv.m_nRun = mcSTEP;
		g_LdMz.m_nRun = mcSTEP;
		break;

	case HOME(2): // Pusher Front Fwd/Bwd
		if(pmBWD == g_LdMz.m_pCylPusherF->GetPos(100))
			g_LdMz.m_pCylPusherF->Actuate(pmFWD);
		else
			g_LdMz.m_pCylPusherF->Actuate(pmBWD);
		break;

	case STEP(2): // Pusher Front Cycle
		if(g_LdMz.m_fsm.IsRun())
			break;
		if(!g_LdMz.m_pMtElv->IsRdy(LDMZ::P_MZ_Z_WORK) || !g_LdMz.m_pMtTrf->IsRdy(LDMZ::P_MZ_TRF_F_WORK))
			break;
		g_LdMz.m_fsm.SetStatus(LDMZ::C_PUSHER_F_START);
		break;

	case HOME(3): // Pusher Front Fwd/Bwd
		if(pmBWD == g_LdMz.m_pCylPusherR->GetPos(100))
			g_LdMz.m_pCylPusherR->Actuate(pmFWD);
		else
			g_LdMz.m_pCylPusherR->Actuate(pmBWD);
		break;

	case STEP(3): // Pusher Front Cycle
		if(g_LdMz.m_fsm.IsRun())
			break;
		if(!g_LdMz.m_pMtElv->IsRdy(LDMZ::P_MZ_Z_WORK) || !g_LdMz.m_pMtTrf->IsRdy(LDMZ::P_MZ_TRF_R_WORK))
			break;
		g_LdMz.m_fsm.SetStatus(LDMZ::C_PUSHER_R_START);
		break;

	case HOME(4): // Cyl Clamp
	case STEP(4):
		if(pmUP == g_LdMz.m_pCylClamp->GetPos(100))
			g_LdMz.m_pCylClamp->Actuate(pmDOWN);
		else
			g_LdMz.m_pCylClamp->Actuate(pmUP);
		break;

	case HOME(5):
	case STEP(5):
		if(!AOn(iLdMzLoading1) || !AOn(iLdMzLoading2))
			break;
		if(g_LdMz.m_fsm.IsRun())
			break;
		if(!g_LdMz.m_pMtTrf->IsRdy(LDMZ::P_MZ_TRF_F_WORK))
		{
			if(g_LdMz.m_pMtElv->IsRdy(LDMZ::P_MZ_Z_WORK))
			{
				g_LdMz.m_pMtTrf->Move(LDMZ::P_MZ_TRF_F_WORK);
			}
			break;
		}
			
		g_LdMz.m_fsm.SetStatus(LDMZ::C_UNLOADING_START);
		break;

	case HOME(6):  //Ld MZ Guide Home
		if(g_allHome.PartHomeStart(HOME_LOADER_MZ_GUIDE))
		{
			g_mt[MT_ON_LOADER_CONV].CancelHomeSearch();
		}
		break;

	case STEP(6):
		break;

	//////////////////////////////////////////////////////////////////////////
	// IN-RAIL PART
	case HOME(11): // Front Home
		if(AOn(i1stRailFrontStripChk1) || AOn(i1stRailFrontStripChk2) || AOn(i1stRailFrontStripChk3)
		|| AOn(i1stRailFrontStripChk4) || AOn(i1stRailFrontStripChk5) || AOn(i1stRailFrontStripChk6))
		{
			g_err.Save(WR_INRAIL_F_STRIP_EXIST);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_INRAIL_FRONT))
		{
			g_InRail[_INRAIL_F_].m_pMtInRail->CancelHomeSearch();
			g_InRail[_INRAIL_F_].m_pMtGripper->CancelHomeSearch();
		}
		break;

	case STEP(11):
		break;

	case HOME(12): // Rear Home
		if(AOn(i1stRailRearStripChk1) || AOn(i1stRailRearStripChk2) || AOn(i1stRailRearStripChk3)
		|| AOn(i1stRailRearStripChk4) || AOn(i1stRailRearStripChk5) || AOn(i1stRailRearStripChk6))
		{
			g_err.Save(WR_INRAIL_R_STRIP_EXIST);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_INRAIL_REAR))
		{
			g_InRail[_INRAIL_R_].m_pMtInRail->CancelHomeSearch();
			g_InRail[_INRAIL_R_].m_pMtGripper->CancelHomeSearch();
		}
		break;

	case STEP(12):
		break;

	case HOME(13): // Cyl Gripper
	case STEP(13):
		if(pmOPEN == g_InRail[_INRAIL_F_].m_pCylGripperOC->GetPos(100))
			g_InRail[_INRAIL_F_].m_pCylGripperOC->Actuate(pmCLOSE);
		else
			g_InRail[_INRAIL_F_].m_pCylGripperOC->Actuate(pmOPEN);
		break;

	case HOME(14): 
	case STEP(14):
		if(pmOPEN == g_InRail[_INRAIL_R_].m_pCylGripperOC->GetPos(100))
			g_InRail[_INRAIL_R_].m_pCylGripperOC->Actuate(pmCLOSE);
		else
			g_InRail[_INRAIL_R_].m_pCylGripperOC->Actuate(pmOPEN);
		break;


	//////////////////////////////////////////////////////////////////////////
	// ID VI PART
	case HOME(16):
		if(g_allHome.PartHomeStart(HOME_ID_VISION))
		{
			g_mt[MT_VISION_INRAIL_Y_FRONT].CancelHomeSearch();
			g_mt[MT_VISION_INRAIL_Y_REAR].CancelHomeSearch();
		}
		break;
	case STEP(16):
		break;

	case HOME(17):
		g_pm[CYL_1ST_RAIL_REAR_GRIPPER_CLAMP].Actuate(pmUP);
		break;
	case STEP(17):
		g_pm[CYL_1ST_RAIL_REAR_GRIPPER_CLAMP].Actuate(pmDOWN);
		break;


	//////////////////////////////////////////////////////////////////////////
	// LD PICKER
	case HOME(21):
		if(g_allHome.PartHomeStart(HOME_LOADER_PICKER))
		{
			g_LdPicker.m_pMtY->CancelHomeSearch();
			g_LdPicker.m_pMtZ->CancelHomeSearch();
		}
		break;
	case STEP(21):
		g_LdPicker.m_nRun = mcSTEP;
		break;

	case HOME(22): // Vacuum
		g_LdPicker.m_pVac->Actuate(FALSE);
		break;
	case STEP(22):
		g_LdPicker.m_pVac->Actuate(TRUE);
		break;


	//////////////////////////////////////////////////////////////////////////
	// ULD PICKER
	case HOME(31):
		if(g_allHome.PartHomeStart(HOME_UNLOADER_PICKER))
		{
			g_UldPicker.m_pMtY->CancelHomeSearch();
			g_UldPicker.m_pMtZ->CancelHomeSearch();
		}
		break;
	case STEP(31):
		break;

	case HOME(32):  // Vacuum
		g_UldPicker.m_pVac->Actuate(FALSE);
		break;
	case STEP(32):
		g_UldPicker.m_pVac->Actuate(TRUE);
		break;

	// OFF RAIL
	case HOME(33):
		if(AOn(i4thRailStripChk3) || AOn(iOffRailStripExist))
		{
			g_err.Save(WR_OFFRAIL_STRIP_EXIST);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_OFF_RAIL))
		{
			g_OffRail.m_pMtY->CancelHomeSearch();
			g_OffRail.m_pMtConv->CancelHomeSearch();
		}
		break;

	case STEP(33):
		break;


	//////////////////////////////////////////////////////////////////////////
	// QC VISION
	case HOME(35):
		if(g_allHome.PartHomeStart(HOME_QC_VISION))
		{
			g_mt[MT_VISION_OUT_RAIL].CancelHomeSearch();
		}
		break;
	case STEP(35):
		break;

	case HOME(36): // Qc Vision Cyl U/D
	case STEP(36):
		if(pmUP == g_OutRail.m_pCylVisionUD->GetPos(100))
			g_OutRail.m_pCylVisionUD->Actuate(pmDOWN);
		else
			g_OutRail.m_pCylVisionUD->Actuate(pmUP);
		break;

	//////////////////////////////////////////////////////////////////////////
	// LD RAIL
	case HOME(41): 
		if(AOn(i1stRailFrontStripChk6) || AOn(i1stRailRearStripChk6))
		{
			g_err.Save(WR_INRAIL_JAM);
			break;
		}
		if(AOn(i2ndRailStripChk1) || AOn(i2ndRailStripChk2) || AOn(i2ndRailStripChk3))
		{
			g_err.Save(WR_LDRAIL_STRIP_EXIST);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_LOADER_RAIL))
		{
			g_LdRail.m_pMtRail->CancelHomeSearch();
			g_LdRail.m_pMtPusher->CancelHomeSearch();
			g_LdRail.m_pMtZ->CancelHomeSearch();
			g_LdRail.m_pMtY->CancelHomeSearch();
		}
		break;
	case STEP(41):
		break;

	case HOME(42): // Pusher 1 U/D
	case STEP(42):
		if(pmUP == g_LdRail.m_pCylPusher1UD->GetPos(100))
			g_LdRail.m_pCylPusher1UD->Actuate(pmDOWN);
		else
			g_LdRail.m_pCylPusher1UD->Actuate(pmUP);
		break;

	case HOME(43): // Pusher 2 U/D
	case STEP(43):
		if(pmUP == g_LdRail.m_pCylPusher2UD->GetPos(100))
			g_LdRail.m_pCylPusher2UD->Actuate(pmDOWN);
		else
			g_LdRail.m_pCylPusher2UD->Actuate(pmUP);
		break;


	case STEP(50):
		g_InRail[_INRAIL_F_].m_nRun = mcSTEP;
		break;

	//////////////////////////////////////////////////////////////////////////
	// ULD RAIL
	case HOME(51): 
		if(AOn(i3rdRailStripChk1) || AOn(i3rdRailStripChk2) || AOn(i3rdRailStripChk3))
		{
			g_err.Save(WR_ULDRAIL_STRIP_EXIST);
			break;
		}
		if(AOn(i4thRailStripChk1))
		{
			g_err.Save(WR_OUTRAIL_JAM);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_UNLOADER_RAIL))
		{
			g_UldRail.m_pMtRail->CancelHomeSearch();
			g_UldRail.m_pMtGripper->CancelHomeSearch();
			g_UldRail.m_pMtZ->CancelHomeSearch();
			g_UldRail.m_pMtY->CancelHomeSearch();
		}
		break;
	case STEP(51):
		break;

	case HOME(52):
	case STEP(52):
		break;

	case HOME(53):
	case STEP(53):
		break;

	//////////////////////////////////////////////////////////////////////////
	// OUT RAIL
	case HOME(61):
		if(AOn(i4thRailStripChk1) || AOn(i4thRailStripChk2) || AOn(i4thRailStripChk3))
		{
			g_err.Save(WR_OUTRAIL_STRIP_EXIST);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_OUT_RAIL))
		{
			g_OutRail.m_pMtOutRail->CancelHomeSearch();
			g_OutRail.m_pMtGripper->CancelHomeSearch();
		}
		break;
	case STEP(61):
		break;

	case HOME(62):
	case STEP(62):
		break;

	case HOME(63):
	case STEP(63):
		break;

	case HOME(64): // Uld Pusher U/D
	case STEP(64):
		if(pmDOWN == g_OutRail.m_pCylPusherUD->GetPos(100))
			g_OutRail.m_pCylPusherUD->Actuate(pmUP);
		else
			g_OutRail.m_pCylPusherUD->Actuate(pmDOWN);
		break;

	case HOME(65): // Uld Pusher F/B
	case STEP(65):
		if(pmFWD == g_OutRail.m_pCylPusherFB->GetPos(100))
			g_OutRail.m_pCylPusherFB->Actuate(pmBWD);
		else
			g_OutRail.m_pCylPusherFB->Actuate(pmFWD);
		break;

	//////////////////////////////////////////////////////////////////////////
	// ULD M/Z
	case HOME(71):
		if(AOn(i4thRailStripChk3))
		{
			g_err.Save(WR_OUTRAIL_JAM);
			break;
		}

		if(g_allHome.PartHomeStart(HOME_UNLOADER_ELV))
		{
			g_UldMz.m_pMtElv->CancelHomeSearch();
			g_UldMz.m_pMtTrf->CancelHomeSearch();
		}
		break;
	case STEP(71):
		break;

	case HOME(72):
	case STEP(72):
		if(pmDOWN == g_UldMz.m_pCylClamp->GetPos(100))
			g_UldMz.m_pCylClamp->Actuate(pmUP);
		else
			g_UldMz.m_pCylClamp->Actuate(pmDOWN);
		break;

	case HOME(73):
	case STEP(73):
		break;

	case HOME(74):
	case STEP(74):
		
		break;

	case HOME(75):
	case STEP(75):
		if(!AOn(iUldBtmMzLoading1) || !AOn(iUldBtmMzLoading2))
			break;
		if(g_UldMz.m_fsm.IsRun())
			break;
		if(!g_UldMz.m_pMtTrf->IsRdy(ULDMZ::P_MZ_TRF_WORK))
			break;

		g_UldMz.m_fsm.SetStatus(ULDMZ::C_UNLOADING_START);
		break;

	case HOME(77):  //Uld MZ Guide Home
		if(g_allHome.PartHomeStart(HOME_UNLOADER_MZ_GUIDE))
		{
			g_mt[MT_OFF_LOADER_CONV].CancelHomeSearch();
		}
		break;

	case STEP(77):
		break;

	case HOME(80):  //Buffer 01 Home
		if(g_Buffer.StripIsExist(0))
		{
			g_err.Save(ER_BUFFER_01_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_01].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_01].StartHomeSearch();
		break;

	case HOME(81):  //Buffer 02 Home
		if(g_Buffer.StripIsExist(1))
		{
			g_err.Save(ER_BUFFER_02_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_02].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_02].StartHomeSearch();
		break;

	case HOME(82):  //Buffer 03 Home
		if(g_Buffer.StripIsExist(2))
		{
			g_err.Save(ER_BUFFER_03_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_03].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_03].StartHomeSearch();
		break;

	case HOME(83):  //Buffer 04 Home
		if(g_Buffer.StripIsExist(3))
		{
			g_err.Save(ER_BUFFER_04_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_04].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_04].StartHomeSearch();
		break;

	case HOME(84):  //Buffer 05 Home
		if(g_Buffer.StripIsExist(4))
		{
			g_err.Save(ER_BUFFER_05_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_05].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_05].StartHomeSearch();
		break;

	case HOME(85):  //Buffer 06 Home
		if(g_Buffer.StripIsExist(5))
		{
			g_err.Save(ER_BUFFER_06_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_06].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_06].StartHomeSearch();
		break;

	case HOME(86):  //Buffer 07 Home
		if(g_Buffer.StripIsExist(6))
		{
			g_err.Save(ER_BUFFER_07_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_07].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_07].StartHomeSearch();
		break;

	case HOME(87):  //Buffer 08 Home
		if(g_Buffer.StripIsExist(7))
		{
			g_err.Save(ER_BUFFER_08_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_08].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_08].StartHomeSearch();
		break;

	case HOME(88):  //Buffer 09 Home
		if(g_Buffer.StripIsExist(8))
		{
			g_err.Save(ER_BUFFER_09_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_09].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_09].StartHomeSearch();
		break;

	case HOME(89):  //Buffer 10 Home
		if(g_Buffer.StripIsExist(9))
		{
			g_err.Save(ER_BUFFER_10_STRIP_EXIST);
			break;
		}

		g_mt[MT_BUFFER_CONV_10].CancelHomeSearch();
		g_mt[MT_BUFFER_CONV_10].StartHomeSearch();
		break;

	case HOME(90):
		if(g_allHome.PartHomeStart(HOME_MZ_TRANSFER))
		{
			g_MzTrans.m_pMtX->CancelHomeSearch();
			g_MzTrans.m_pMtTrf->CancelHomeSearch();
		}
		break;
	case STEP(90):
		g_InRail[_INRAIL_F_].m_MtTrigger.StartTrigOneShot();
		g_InRail[_INRAIL_F_].m_MtTrigger.ResetTrigger();
		break;

	case STEP(91):
		if(!g_InRail[_INRAIL_F_].m_pMtGripper->IsRdy() || !g_InRail[_INRAIL_F_].m_pMtVision->IsRdy())
			break;

		g_InRail[_INRAIL_F_].m_pMtVision->Move(P_VI_ID_MARK);
		g_InRail[_INRAIL_F_].m_fsmGrip.SetStatus(INRAIL::C_ID_VISION_START);
		break;

	case STEP(92):
		if(!g_InRail[_INRAIL_R_].m_pMtGripper->IsRdy() || !g_InRail[_INRAIL_F_].m_pMtVision->IsRdy())
			break;

		g_InRail[_INRAIL_R_].m_pMtVision->Move(P_VI_ID_MARK);
		g_InRail[_INRAIL_R_].m_fsmGrip.SetStatus(INRAIL::C_ID_VISION_START);
		break;

	case STEP(93):
		if(!g_InRail[_INRAIL_R_].m_pMtGripper->IsRdy() || !g_InRail[_INRAIL_F_].m_pMtVision->IsRdy())
			break;
		if(!g_InRail[_INRAIL_F_].m_pMtGripper->IsRdy() || !g_InRail[_INRAIL_F_].m_pMtVision->IsRdy())
			break;
		if(!g_OutRail.m_pMtGripper->IsRdy() || !g_OutRail.m_pMtVision->IsRdy())
			break;

		g_OutRail.m_pMtVision->Move(P_VI_QC_MARK);
		g_OutRail.m_fsm.SetStatus(OUTRAIL::C_QC_VI_START);

		g_InRail[_INRAIL_F_].m_pMtVision->Move(P_VI_ID_MARK);
		g_InRail[_INRAIL_F_].m_fsmGrip.SetStatus(INRAIL::C_ID_VISION_START);

		g_InRail[_INRAIL_R_].m_pMtVision->Move(P_VI_ID_MARK);
		g_InRail[_INRAIL_R_].m_fsmGrip.SetStatus(INRAIL::C_ID_VISION_START);
		break;

	case STEP(94):
		if(!g_OutRail.m_pMtGripper->IsRdy() || !g_OutRail.m_pMtVision->IsRdy())
			break;

		g_OutRail.m_pMtVision->Move(P_VI_QC_MARK);
		g_OutRail.m_fsm.SetStatus(OUTRAIL::C_QC_VI_START);
		break;

	case STEP(98): // Multi Step 
		if(g_nv.NDm(stepLdMz))
			g_LdMz.m_nRun = mcSTEP;
		if(g_nv.NDm(stepInRailF))
			g_InRail[_INRAIL_F_].m_nRun = mcSTEP;
		if(g_nv.NDm(stepInRailR))
			g_InRail[_INRAIL_R_].m_nRun = mcSTEP;
		if(g_nv.NDm(stepLdRail))
			g_LdRail.m_nRun	= mcSTEP;
		if(g_nv.NDm(stepLdPicker))
			g_LdPicker.m_nRun = mcSTEP;
		if(g_nv.NDm(stepBundle))
			g_InBundle.m_nRun	= mcSTEP;
		if(g_nv.NDm(stepUldRail))
			g_UldRail.m_nRun = mcSTEP;
		if(g_nv.NDm(stepOutRail))
			g_OutRail.m_nRun = mcSTEP;
		if(g_nv.NDm(stepOffRail))
			g_OffRail.m_nRun = mcSTEP;
		if(g_nv.NDm(stepUldPicker))
			g_UldPicker.m_nRun = mcSTEP;
		if(g_nv.NDm(stepUldMz))
			g_UldMz.m_nRun = mcSTEP;
		if(g_nv.NDm(stepMzTrans))
			g_MzTrans.m_nRun = mcSTEP;
		if(g_nv.NDm(stepBuffer))
			g_Buffer.m_nRun = mcSTEP;
		if(g_nv.NDm(stepLdInConvTop))
			g_LdInTopConv.m_nRun = mcSTEP;
		if(g_nv.NDm(stepLdInConvMid))
			g_LdInMidConv.m_nRun = mcSTEP;
		if(g_nv.NDm(stepLdOutConv))
			g_LdOutConv.m_nRun   = mcSTEP;
		if(g_nv.NDm(stepUldConvTop))
			g_UldTopConv.m_nRun  = mcSTEP;
		if(g_nv.NDm(stepUldConvBtm))
			g_UldBtmConv.m_nRun  = mcSTEP;
		if(g_nv.NDm(stepOutBundle))
			g_OutBundle.m_nRun = mcSTEP;
		break;

	//////////////////////////////////////////////////////////////////////////
	case HOME(99): // All Home
		{
			if(!g_opr.bStop || g_allHome.m_bStartAll)
				break;

			for(int mtno = 0; mtno < MT_MAX; mtno++)
			{
				g_mt[mtno].CancelHomeSearch();
			}

			if(AOn(i1stRailFrontStripChk1) || AOn(i1stRailFrontStripChk2) || AOn(i1stRailFrontStripChk3)
				|| AOn(i1stRailFrontStripChk4) || AOn(i1stRailFrontStripChk5) || AOn(i1stRailFrontStripChk6))
			{
				g_err.Save(WR_INRAIL_F_STRIP_EXIST);
				break;
			}

			if(AOn(i1stRailRearStripChk1) || AOn(i1stRailRearStripChk2) || AOn(i1stRailRearStripChk3)
				|| AOn(i1stRailRearStripChk4) || AOn(i1stRailRearStripChk5) || AOn(i1stRailRearStripChk6))
			{
				g_err.Save(WR_INRAIL_R_STRIP_EXIST);
				break;
			}

			if(AOn(i4thRailStripChk3) || AOn(iOffRailStripExist))
			{
				g_err.Save(WR_OFFRAIL_STRIP_EXIST);
				break;
			}

			if(AOn(i3rdRailStripChk1) || AOn(i3rdRailStripChk2) || AOn(i3rdRailStripChk3))
			{
				g_err.Save(WR_ULDRAIL_STRIP_EXIST);
				break;
			}

			g_allHome.m_bStartAll = TRUE;
		}
		break;

	case HOME(100): // Ld Part Home
		{
			if(!g_opr.bStop || g_allHome.m_bStartAll)
				break;
			
			if(g_allHome.PartHomeStart(HOME_LOADER_PART_ALL))
			{
				g_mt[MT_ON_LOADER_Z].CancelHomeSearch();
				g_mt[MT_ON_LOADER_Y].CancelHomeSearch();
				g_mt[MT_VISION_INRAIL_Y_FRONT].CancelHomeSearch();
				g_mt[MT_VISION_INRAIL_Y_REAR].CancelHomeSearch();
				g_mt[MT_1ST_RAIL_CONV_FRONT].CancelHomeSearch();
				g_mt[MT_1ST_RAIL_GRIPPER_FRONT].CancelHomeSearch();
				g_mt[MT_1ST_RAIL_CONV_REAR].CancelHomeSearch();
				g_mt[MT_1ST_RAIL_GRIPPER_REAR].CancelHomeSearch();
				g_mt[MT_ON_PNP_Y].CancelHomeSearch();
				g_mt[MT_ON_PNP_Z].CancelHomeSearch();
				g_mt[MT_2ND_RAIL_CONV].CancelHomeSearch();
				g_mt[MT_2ND_RAIL_PUSHER].CancelHomeSearch();
				g_mt[MT_2ND_RAIL_Z].CancelHomeSearch();
				g_mt[MT_2ND_RAIL_Y1].CancelHomeSearch();
				g_mt[MT_ON_LOADER_CONV].CancelHomeSearch();
			}
		}
		break;

	case HOME(101): // Uld Part Home
		{
			if(!g_opr.bStop || g_allHome.m_bStartAll)
				break;

			if(g_allHome.PartHomeStart(HOME_UNLOADER_PART_ALL))
			{
				g_mt[MT_3RD_RAIL_CONV].CancelHomeSearch();
				g_mt[MT_3RD_RAIL_GRIPPER].CancelHomeSearch();
				g_mt[MT_3RD_RAIL_Z].CancelHomeSearch();
				g_mt[MT_3RD_RAIL_Y1].CancelHomeSearch();
				g_mt[MT_4TH_RAIL_CONV].CancelHomeSearch();
				g_mt[MT_4TH_RAIL_GRIPPER].CancelHomeSearch();
				g_mt[MT_OFF_LOADER_Z].CancelHomeSearch();
				g_mt[MT_OFF_LOADER_Y].CancelHomeSearch();
				g_mt[MT_VISION_OUT_RAIL].CancelHomeSearch();
				g_mt[MT_OFF_LOADER_CONV].CancelHomeSearch();
				g_mt[MT_OFF_PNP_Y].CancelHomeSearch();
				g_mt[MT_OFF_PNP_Z].CancelHomeSearch();
				g_mt[MT_OFF_RAIL_CONV].CancelHomeSearch();
				g_mt[MT_OFF_RAIL_Y].CancelHomeSearch();
			}
		}
		break;

		// Front InRail Vision Cycle
	case HOME(110):
		if(!g_InRail[_INRAIL_F_].m_pMtGripper->IsRdy() || !g_InRail[_INRAIL_F_].m_pMtVision->IsRdy())
			break;
		
		g_InRail[_INRAIL_F_].m_pMtVision->Move(P_VI_ID_MARK);
		g_InRail[_INRAIL_F_].m_fsmGrip.SetStatus(INRAIL::C_ID_VISION_START);
		break;

		// Rear InRail Vision Cycle
	case HOME(120):
		if(!g_InRail[_INRAIL_R_].m_pMtGripper->IsRdy() || !g_InRail[_INRAIL_R_].m_pMtVision->IsRdy())
			break;

		g_InRail[_INRAIL_R_].m_pMtVision->Move(P_VI_ID_MARK);
		g_InRail[_INRAIL_R_].m_fsmGrip.SetStatus(INRAIL::C_ID_VISION_START);
		break;

		// Out Rail Vision Cycle
	case HOME(130):
		if(!g_OutRail.m_pMtGripper->IsRdy() || !g_OutRail.m_pMtVision->IsRdy())
			break;

		g_OutRail.m_pMtVision->Move(P_VI_QC_MARK);
		g_OutRail.m_fsm.SetStatus(OUTRAIL::C_QC_VI_START);
		break;
	}
}
Esempio n. 10
0
static bool atHomePosition(GHOST_TEventNDOFMotionData* ndof)
{
#define HOME(foo) (ndof->foo == 0)
    return HOME(tx) && HOME(ty) && HOME(tz) && HOME(rx) && HOME(ry) && HOME(rz);
#undef HOME
}
Esempio n. 11
0
/*!
  \brief pops up a Filechooser dialog to select a file
  \param data is a pointer to a MtxFileIO structure which contains important
  bits like the path to start, the filter, default filename and so on
  \see MtxFileIO
  \returns the path to the file or NULL if cancelled
  */
gchar * choose_file(MtxFileIO *data)
{
	GtkWidget *dialog = NULL;
	GtkFileFilter *filter = NULL;
	GSList *filters = NULL;
	gchar *path = NULL;
	gchar *defdir = NULL;
	gchar *filename = NULL;
	gchar *tmpbuf = NULL;
	gchar **vector = NULL;
	const gchar *project = NULL;
	gint response = 0;
	gboolean res = FALSE;
	guint i = 0;

	ENTER();
	if (!GTK_IS_WINDOW(data->parent))
		data->parent = NULL;
	/*
	printf("choose_file\n");
	printf("parent %p\n",(void *)data->parent);
	printf("on_top %s\n",data->on_top? "TRUE":"FALSE");
	printf("filter %s\n",data->filter);
	printf("filename %s\n",data->filename);
	printf("default_filename %s\n",data->default_filename);
	printf("default_extension %s\n",data->default_extension);
	printf("absolute_path %s\n",data->absolute_path);
	printf("default_path %s\n",data->default_path);
	printf("external_path %s\n",data->external_path);
	printf("shortcut_folders %s\n",data->shortcut_folders);
	printf("project %s\n",data->project);
	printf("title %s\n",data->title);
	*/
	if (data->project)
		project = data->project;
	else
		project = DEFAULT_PROJECT;

	if (!data->title)
		data->title = g_strdup("Open File");

	if ((data->action == GTK_FILE_CHOOSER_ACTION_OPEN) || 
			(data->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER))
	{
		/*printf("ACTION_OPEN before gtk_file_chooser_dialog_new\n");*/
		dialog = gtk_file_chooser_dialog_new(data->title,
				/*GTK_WINDOW(data->parent), */
				0,
				data->action,
				GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
				GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,
				NULL);
		/*printf("after gtk_file_chooser_dialog_new\n");*/
		if ((data->on_top) && (GTK_IS_WIDGET(data->parent)))
			gtk_window_set_transient_for(GTK_WINDOW(gtk_widget_get_toplevel(dialog)),GTK_WINDOW(data->parent));

		if ((data->absolute_path) && (!data->default_path))
			gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog),data->absolute_path);
		else if (data->default_path)
		{
			/*printf("should be using system path + %s\n",data->default_path);*/
			path = g_build_filename(MTXSYSDATA,data->default_path,NULL);
			if (!g_file_test(path,G_FILE_TEST_IS_DIR))
			{
				g_free(path);
				path = g_build_filename(HOME(),"mtx",data->project,data->default_path, NULL);
				/*printf("System path is not found, falling back to user path %s\n",path);*/
			}
			gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog),path);
			g_free(path);
		}
	}
	else if (data->action == GTK_FILE_CHOOSER_ACTION_SAVE)
	{
		/*printf("ACTION_SAVE calling gtk_file_chooser_dialog_new\n");*/
		dialog = gtk_file_chooser_dialog_new(data->title,
				/*GTK_WINDOW(data->parent), */
				0,
				data->action,
				GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
				GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
				NULL);	
		/*printf("after gtk_file_chooser_dialog_new\n");*/

		/*		if ((data->on_top) && (GTK_IS_WIDGET(data->parent)))
					gtk_window_set_transient_for(GTK_WINDOW(gtk_widget_get_toplevel(dialog)),GTK_WINDOW(data->parent));
		*/

		if (data->default_path)
		{
			defdir = g_build_filename(HOME(),"mtx",data->project,data->default_path, NULL);
			if (!g_file_test(defdir,G_FILE_TEST_IS_DIR))
				g_mkdir(defdir,0755);
		}
		else
			defdir = g_build_filename(HOME(),"mtx",data->project, NULL);
		/* If filename passed check/adj path  */
		if (data->filename)
		{
			if (g_strrstr(data->filename,DATA_DIR) != NULL)
			{
				vector = g_strsplit(data->filename,PSEP,-1);
				tmpbuf = g_strconcat(defdir,PSEP,vector[g_strv_length(vector)-1],NULL);
				gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),defdir);
				gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(dialog),vector[g_strv_length(vector)-1]);
				g_strfreev(vector);
				g_free(tmpbuf);
			}
			else
				gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(dialog),data->filename);
		}
		else
		{
			gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(dialog),defdir);
			gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (dialog), data->default_filename );
		}
		g_free(defdir);

	}
	else
	{
		EXIT();
		return NULL;
	}
	/* Add shortcut folders...  */
	if (data->shortcut_folders)
	{
		vector = g_strsplit(data->shortcut_folders,",",-1);
		for (i=0;i<g_strv_length(vector);i++)
		{
			path = g_build_filename(MTXSYSDATA,vector[i],NULL);
			gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(dialog),path,NULL);
			g_free(path);
			path = g_build_filename(HOME(),"mtx",data->project,vector[i],NULL);
			gtk_file_chooser_add_shortcut_folder(GTK_FILE_CHOOSER(dialog),path,NULL);
			g_free(path);
		}
		g_strfreev(vector);
	}
	
	/* If default path switch to that place  */
	if ((data->external_path) && (!(data->default_path)))
	{
		/*printf("external path with no default path\n");*/
		path = g_build_filename(HOME(),"mtx",data->project,data->external_path,NULL);
		if (!g_file_test(path,G_FILE_TEST_IS_DIR))
			g_mkdir(path,0755);
		gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER(dialog),path);
		g_free(path);

	}

	/* If filters, assign them 
	  CAUSES SEGFAULTS???
	  */
	/*
	if (data->filter)
	{
		printf("data->filter is set to \"%s\"\n",data->filter);
		vector = g_strsplit(data->filter,",",-1);
		if (g_strv_length(vector)%2 > 0)
			goto afterfilter;
		for (i=0;i<g_strv_length(vector);i+=2)
		{
			filter = gtk_file_filter_new();
			gtk_file_filter_add_pattern(GTK_FILE_FILTER(filter),vector[i]);
			printf("Filter glob is set to \"%s\"\n",vector[i]);
			gtk_file_filter_set_name(GTK_FILE_FILTER(filter),vector[i+1]);
			printf("Filter name is set to \"%s\"\n",vector[i+1]);
			gtk_file_chooser_add_filter(GTK_FILE_CHOOSER(dialog),filter);
		}
		gtk_file_chooser_set_filter(GTK_FILE_CHOOSER(dialog),filter);
		g_strfreev(vector);
	}
	*/
afterfilter:
	/* Turn on overwriteconfirmation  */
	gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
	g_signal_connect(G_OBJECT(dialog),"confirm-overwrite",
			G_CALLBACK (confirm_overwrite_callback), NULL);
	if (data->action == GTK_FILE_CHOOSER_ACTION_OPEN)
	{
		if (data->default_filename)
		{
			/*printf("data->default_filename is set to \"%s\"\n",data->default_filename);*/
			gtk_file_chooser_select_filename(GTK_FILE_CHOOSER(dialog),data->default_filename);
		}
	}

	/*printf("initiating dialog to run\n");*/
	response = gtk_dialog_run (GTK_DIALOG (dialog));
	/*printf("it returned \n");*/
	if (response == GTK_RESPONSE_ACCEPT)
	{
		tmpbuf = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
		if ((data->action == GTK_FILE_CHOOSER_ACTION_SAVE) && (data->default_extension))
		{
			if(!g_str_has_suffix (tmpbuf,data->default_extension))
				filename = g_strjoin(".",tmpbuf,data->default_extension,NULL);
			else
				filename = g_strdup(tmpbuf);
		}
		else
			filename = g_strdup(tmpbuf);
		g_free(tmpbuf);
	}
	filters = gtk_file_chooser_list_filters(GTK_FILE_CHOOSER(dialog));
	if (filters)
	{
		g_slist_foreach(filters, remove_filter ,dialog);
		g_slist_free(filters);
	}

	gtk_widget_destroy (dialog);
	EXIT();
	return (filename);
}
Esempio n. 12
0
/*!
  \brief When the user selects the OK button the new table is calculated
  packaged up, dumped to a file as well as being sent to the ECU to live 
  a long and happy life
  \param widget is the OK button the user clicked
  \param data is unused
  \returns TRUE on success, FALSE otherwise
  */
G_MODULE_EXPORT gboolean afr_calibrate_calc_and_dl(GtkWidget *widget, gpointer data)
{
	static gdouble diywbBv[] = { 0.00, 1.40, 1.45, 1.50, 1.55, 1.60, 
		1.65, 1.70, 1.75, 1.80, 1.85, 1.90, 1.95, 2.00, 2.05, 2.10,
		2.15, 2.20, 2.25, 2.30, 2.35, 2.40, 2.45, 2.50, 2.55, 2.60,
		2.65,  2.70,  2.75,  2.80,  2.85,  2.90,  4.00,  5.01 };
	static gdouble diywbBa[] = { 7.42, 10.08, 10.23, 10.38, 10.53, 10.69,
		10.86, 11.03, 11.20, 11.38, 11.57, 11.76, 11.96, 12.17, 12.38,
		12.60, 12.83, 13.07, 13.31, 13.57, 13.84, 14.11, 14.40, 14.70,
		15.25, 15.84, 16.48, 17.18, 17.93, 18.76, 19.66, 20.66, 40.00,
		60.00 };
	static gdouble lbwbBv[] = {0.00,  2.05,  4.21,  4.98,  5.01};
	static gdouble lbwbBa[] = {1.00, 11.00, 14.70, 16.00, 99.00};
	static gdouble teSVoutBv[] = { 1.024, 1.076, 1.126, 1.177, 1.227,
		1.278, 1.330, 1.380, 1.431, 1.481, 1.532, 1.581,
		1.626, 1.672, 1.717, 1.761, 1.802, 1.842, 1.883,
		1.926, 1.971, 2.015, 2.053, 2.104, 2.150, 2.192,
		2.231, 2.267, 2.305, 2.347, 2.398, 2.455, 2.514,
		2.556, 2.602, 2.650, 2.698, 2.748, 2.797, 2.846,
		2.900, 2.945, 2.991, 3.037, 3.083, 3.129, 3.175,
		3.221, 3.266, 3.313, 3.359, 3.404, 3.451, 3.496,
		3.542, 3.587, 3.634, 3.680, 3.725, 3.772, 3.817,
		3.863, 3.910, 3.955, 4.001 };
	static gdouble teSVoutBa[] = { 8.95, 9.11, 9.26, 9.41, 9.56, 9.71,
		9.87, 10.02, 10.17, 10.32, 10.47, 10.63, 10.78,
		10.93, 11.08, 11.24, 11.39, 11.54, 11.69, 11.86,
		12.04, 12.23, 12.39, 12.62, 12.83, 13.03, 13.21,
		13.4, 13.59, 13.82, 14.1, 14.43, 14.83, 15.31,
		15.85, 16.47, 17.15, 17.9, 18.7, 19.57, 20.5,
		21.5, 22.59, 23.78, 25.1, 26.54, 28.14, 29.9,
		31.87, 34.11, 36.81, 40.27, 45.1, 52.38, 63.92,
		82.66, 99.0, 99.0, 99.0, 99.0, 99.0, 99.0, 99.0,
		99.0, 99.0};
	static gdouble aemLinBv[] = { 0.00, 0.16, 0.31, 0.47, 0.62, 0.78,
		0.94, 1.09, 1.25, 1.40, 1.56, 1.72, 1.87, 2.03, 2.18,
		2.34, 2.50, 2.65, 2.81, 2.96, 3.12, 3.27, 3.43, 3.59,
		3.74, 3.90, 4.05, 4.21, 4.37, 4.52, 4.68, 4.83, 4.99, 5.01 };
	static gdouble aemLinBa[] = { 9.72, 10.01, 10.35, 10.64, 10.98,
		11.27, 11.55, 11.90, 12.18, 12.47, 12.81, 13.10, 13.44,
		13.73, 14.01, 14.35, 14.64, 14.93, 15.27, 15.56, 15.84,
		16.18, 16.47, 16.81, 17.10, 17.39, 17.73, 18.01, 18.36,
		18.64, 18.93, 19.27, 19.56, 99.00 };
	static gdouble aemNonBv[] = { 0.00, 0.16, 0.31, 0.47, 0.62, 0.78,
		0.94, 1.09, 1.25, 1.40, 1.56, 1.72, 1.87, 2.03, 2.18,
		2.34, 2.50, 2.65, 2.81, 2.96, 3.12, 3.27, 3.43, 3.59,
		3.74, 3.90, 4.05, 4.21, 4.37, 4.52, 4.68, 4.83, 4.99,
		5.01 };
	static gdouble aemNonBa[] = { 8.41, 8.52, 8.64, 8.81, 8.98, 9.09,
		9.26, 9.44, 9.61, 9.78, 9.95, 10.12, 10.29, 10.47,
		10.69, 10.92, 11.15, 11.38, 11.67, 11.95, 12.24, 12.58,
		12.92, 13.27, 13.67, 14.13, 14.64, 15.21, 15.84, 16.53,
		17.27, 18.19, 19.44, 99.00 };
	static gdouble fjoBv[] = { 0.000, 0.811, 0.816, 1.256, 1.325,
		1.408, 1.447, 1.667, 1.784, 1.804, 1.872, 1.984, 2.023,
		2.126, 2.209, 2.268, 2.414, 2.454, 2.473, 2.502, 2.522,
		2.581, 2.610, 2.717, 2.766, 2.820, 2.908, 2.933, 2.977,
		3.021, 3.079, 3.099, 3.104, 5.000 };
	static gdouble fjoBa[] = { 0.000, 9.996, 10.011, 11.113, 11.290,
		11.481, 11.569, 12.142, 12.451, 12.510, 12.730, 13.024,
		13.142, 13.465, 13.715, 13.892, 14.377, 14.524, 14.597,
		14.759, 14.876, 15.273, 15.479, 16.302, 16.714, 17.170,
		18.008, 18.243, 18.684, 19.184, 19.801, 19.977, 20.007,
		29.400 };
	static gdouble zeitronixBv[] = { 0.000, 0.150, 0.310, 0.460, 0.620,
		0.780, 0.930, 1.090, 1.240, 1.400, 1.560, 1.710, 1.870,
		2.020, 2.180, 2.340, 2.500, 2.650, 2.800, 2.960, 3.000,
		3.120, 3.270, 5.010 };
	static gdouble zeitronixBa[] = { 0.000, 9.700, 9.900, 10.100,
		10.300, 10.500, 10.700, 11.000, 11.400, 11.700, 12.100,
		12.400, 12.800, 13.200, 13.700, 14.200, 14.700, 15.600,
		16.900, 18.500, 18.800, 19.900, 21.200, 99.000 };
	static gdouble genericBv[4] = { 0.0, 1.0,  4.0, 5.01 };
	static gdouble genericBa[4] = { 0.0, 9.7, 19.7, 99.0 };
	gdouble *Bv = NULL;
	gdouble *Ba = NULL;
	gdouble voltage = 0.0;
	gdouble deltaVoltage = 0.0;
	gdouble vPct = 0.0;
	gint nB = 0;
	gint iV = 0;
	gint adcCount = 0;
	gchar * filename = NULL;
	gdouble afr = 0.0;
	gdouble (*Fv)(gint adc) = NULL;
	gboolean NB = FALSE;
	guint8 table[nADC];
	time_t tim;
	FILE *f = NULL;
	Firmware_Details *firmware = NULL;
	extern gconstpointer *global_data;

	firmware = DATA_GET(global_data,"firmware");

#define USE_TABLE(prefix) \
	Bv = prefix ## Bv; \
	Ba = prefix ## Ba; \
	nB = (sizeof(prefix ## Bv) / sizeof(gdouble));


#define USE_FUNC(prefix) \
	Fv = prefix ## Fv

	switch (afr_enum)
	{
		case narrowBand:
			NB = TRUE;
			USE_FUNC(NB);
			break;
		case diyWB:
			USE_TABLE(diywb);
			break; 
		case dynojetLinear:
			USE_FUNC (djWBlin);
			break;
		case fjo:
			USE_TABLE(fjo);
			break;
		case aemLinear:
			USE_TABLE(aemLin);
			break;
		case aemNonLinear:
			USE_TABLE(aemNon);
			break;
		case twintec:
			USE_FUNC (inno05);
			break;
		case techEdgeLinear:
			USE_FUNC (teWBlin);
			break;
		case techEdgeNonLinear:
			USE_TABLE(teSVout);
			break;
		case innovate12:
			USE_FUNC (inno12);
			break;
		case innovate05:
			USE_FUNC (inno05);
			break;
		case innovateLC1:
			USE_FUNC (innoLC1);
			break;
		case lambdaBoy:
			USE_TABLE(lbwb);
			break;
		case zeitronix:
			USE_TABLE(zeitronix);
			break;
		case genericWB:
			genericBv[1] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("voltage1_entry"))),NULL);
			genericBv[2] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("voltage2_entry"))),NULL);
			genericBa[1] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("afr1_entry"))),NULL);
			genericBa[2] = g_ascii_strtod(gtk_entry_get_text(GTK_ENTRY(lookup_widget_f("afr2_entry"))),NULL);
			USE_TABLE(generic);
			break;
		default:
			printf(_("default case, shouldn't have gotten here. afr_enum is %i"),afr_enum);
			break;
	}
	filename = g_build_filename(HOME(), "afrtable.log",NULL);
	f = fopen(filename, "w");
	g_free(filename);
	iV = 0;
	afr = 0.0;
	time(&tim);

	fprintf(f, "//------------------------------------------------------------------------------\n");
	fprintf(f, "//--  Generated by MegaTunix %s", ctime(&tim));
	fprintf(f, "//--  This file merely records what was sent to your MS-II, and may be        --\n");
	fprintf(f, "//--  deleted at any time.                                                    --\n");
	fprintf(f, "//--  Selected type: %-57s--\n", afr_name);
	fprintf(f, "//------------------------------------------------------------------------------\n");
	fprintf(f, "#ifndef GCC_BUILD\n");
	fprintf(f, "#pragma ROM_VAR EGO_ROM\n");
	fprintf(f, "#endif\n");
	fprintf(f, "const unsigned char egofactor_table[%d] EEPROM_ATTR = {\n", nADC);
	fprintf(f, "         //     afr  adcCount voltage\n");
	for (adcCount = 0; adcCount < nADC; adcCount++) 
	{
		voltage = adcCount / (nADC-1.0) * 5.0;
		if (NB) 
		{
			afr = 0.0;
			table[adcCount] = (adcCount > nADC/5.0) ? 0 : (gint16)(nADC/5.0 - adcCount);
		}
		else 
		{
			if (Fv)
				afr = Fv(adcCount);
			else 
			{
				/* Use curve data from tabular expression of transfer function.*/
				while (voltage > Bv[iV]) 
					iV++;
				deltaVoltage = Bv[iV] - Bv[iV-1];
				if (fabs(deltaVoltage) < 1e-10) /* Curve data is crap.*/
					afr = 999.0;
				else 
				{
					vPct = 1.0 - (Bv[iV] - voltage) / deltaVoltage;
					afr  = vPct * (Ba[iV] - Ba[iV-1]) + Ba[iV-1];
				}
			}
			table[adcCount] = (guint8)(afr*10.0+0.5);
		}

		fprintf(f, "   %4d%c // %7.3f   %4d   %6.3f\n", table[adcCount], (adcCount<nADC-1)?',':' ', afr, adcCount, voltage);
	}
	fprintf(f, "};\n");
	fprintf(f, "#ifndef GCC_BUILD\n");
	fprintf(f, "#pragma ROM_VAR DEFAULT\n");
	fprintf(f, "#endif\n");
	fprintf(f, "//------------------------------------------------------------------------------\n");
	fclose(f);

	ms_table_write(firmware->ego_table_page,
			firmware->page_params[firmware->ego_table_page]->length,
			(guint8 *)table);

	return TRUE;
}
Esempio n. 13
0
//G_MODULE_EXPORT gboolean lookuptable_changed(GtkCellRendererCombo *renderer, gchar *path, gchar * new_text, gpointer data)
G_MODULE_EXPORT gboolean lookuptable_changed(GtkCellRendererCombo *renderer, gchar *path, GtkTreeIter *new_iter, gpointer data)
{
	GtkTreeModel *combostore = NULL;
	GtkTreeIter iter;
	GtkTreeModel *model = (GtkTreeModel *)data;
	ConfigFile *cfgfile = NULL;
	gchar * new_text = NULL;
	gchar * int_name = NULL;
	gchar * old = NULL;
	gchar * new_name = NULL;
	gchar ** vector = NULL;
	const gchar * project = NULL;
	gboolean restart_tickler = FALSE;
	GAsyncQueue *io_data_queue = NULL;
	Firmware_Details *firmware = NULL;

	ENTER();
	firmware = (Firmware_Details *)DATA_GET(global_data,"firmware");
	io_data_queue = (GAsyncQueue *)DATA_GET(global_data,"io_data_queue");

	/* Get combo box model so we can set the combo to this new value */
	g_object_get(G_OBJECT(renderer),"model",&combostore,NULL);
	gtk_tree_model_get(combostore,new_iter,0,&new_text,-1);

	/* Get combo box model so we can set the combo to this new value */
	gtk_tree_model_get_iter_from_string(model,&iter,path);
	gtk_tree_model_get(model,&iter,INTERNAL_NAME_COL,&int_name,FILENAME_COL,&old,-1);
	//printf("New text is %s, int name associated %s, filename %s\n",new_text,int_name,old);
	if (g_ascii_strcasecmp(old,new_text) == 0) /* If no change, return */
	{
		g_free(int_name);
		g_free(old);
		EXIT();
		return TRUE;
	}

	if (g_ascii_strcasecmp(new_text,"Personal") == 0)
	{
		g_free(int_name);
		g_free(old);
		EXIT();
		return TRUE;
	}
	if (g_ascii_strcasecmp(new_text,"System") == 0)
	{
		g_free(int_name);
		g_free(old);
		EXIT();
		return TRUE;
	}
	if (DATA_GET(global_data,"realtime_id"))
	{
		gint count = 0;
		restart_tickler = TRUE;
		stop_tickler(RTV_TICKLER);
		while ((g_async_queue_length(io_data_queue) > 0) && (count < 30))
		{
			MTXDBG(CRITICAL,_("Draining I/O Queue, current length %i\n"),g_async_queue_length(io_data_queue));
			count++;
		}

	}
	get_table(int_name,new_text,NULL); /* Load the new one in it's place */
	gtk_list_store_set(GTK_LIST_STORE(model),&iter, FILENAME_COL, new_text,-1);
	if (restart_tickler)
		start_tickler(RTV_TICKLER);

	cfgfile = cfg_open_file(firmware->profile_filename);
	if (!cfgfile)
	{
		g_free(int_name);
		g_free(old);
		EXIT();
		return FALSE;
	}
	g_hash_table_foreach((GHashTable *)DATA_GET(global_data,"lookuptables"),update_lt_config,cfgfile);
	if (g_strrstr(firmware->profile_filename,"mtx"))
		cfg_write_file(cfgfile, firmware->profile_filename);
	else
	{
		project = (const gchar *)DATA_GET(global_data,"project_name");
		vector = g_strsplit(firmware->profile_filename,PSEP,-1);
		if (!project)
			project = DEFAULT_PROJECT;
		new_name = g_build_filename(HOME(),"mtx",project,INTERROGATOR_DATA_DIR,"Profiles",vector[g_strv_length(vector)-2],vector[g_strv_length(vector)-1],NULL);
		g_strfreev(vector);
		cfg_write_file(cfgfile, new_name);
		g_free(firmware->profile_filename);
		firmware->profile_filename=g_strdup(new_name);
		g_free(new_name);
	}
	cfg_free(cfgfile);

	/*printf("internal name %s, old table %s, new table %s\n",int_name,old,new_text);*/
	g_free(int_name);
	g_free(old);
	EXIT();
	return TRUE;
}
Esempio n. 14
0
void *snake_thread(void *dummy) {
    while(1) {
        // first advance snake parts, delete tail, add head
        if (!got_apple) {
            snake_part *tail = (snake_part *)list_front(&snake);
            free(tail);
        }

        got_apple = 0;

        snake_direction = next_snake_direction;

        snake_part *head = (snake_part *)snake.lastNode->data;
        snake_part *new_head = (snake_part *)malloc(sizeof(snake_part));
        switch (snake_direction) {
            case DIR_UP:
                new_head->x = head->x;
                new_head->y = head->y-1;
                break;
            case DIR_DOWN:
                new_head->x = head->x;
                new_head->y = head->y+1;
                break;
            case DIR_LEFT:
                new_head->x = head->x-1;
                new_head->y = head->y;
                break;
            case DIR_RIGHT:
                new_head->x = head->x+1;
                new_head->y = head->y;
                break;
        }
        list_append(&snake, new_head);
        head = new_head;
        
        // check new head doesnt hit any walls
        if (head->x < 1 || head->x >= BOARD_WIDTH || head->y < 1 || head->y >= BOARD_HEIGHT) {
            end_game();
        }
       
        // check if we hit ourself...
        list_map(&snake, collision_check);

        // apple logic
        if (head->x == apple_x && head->y == apple_y) {
            got_apple = 1;
            score++;
            put_apple();
        }

        // then draw
        CLS();
        draw_board();
        list_map(&snake, draw_part);
        GOTO(apple_x+1, apple_y+1);
        printf("0");
        GOTO(0, BOARD_HEIGHT+2);
        printf("Score: %d", score);
        HOME();
        fflush(stdout);

        usleep(100000);
    }
}