Commit 8e4fd331 authored by Xavier de Blas's avatar Xavier de Blas

chronojump and chronojump_mini both work nicely on windows and linux (events, graphs, ...)

Util.IsWindows prints the operating system
In every Chronojump windows start, put "simulated" in preferences (for solving chronojump crashes on windows for not detecting the chronopic

Chronopic doesn't configure DefaultTimeOut if it's on windows (until we know how to do it)

Before changing to chronopic mode on windows, it's shown a dialog like: "if it's windows, you have to generate a event with chronopic, if not, it will crash, restart (simulated automatically) and then select another port".
New class DialogMessage for all kind of dialogs.
Finally used a confirmWindow because then, chronopic is called wen user clics on accept button.

chronojump-mini now named chronojump_mini (better for Makefile)
chronojump_mini picks port from the user
Makefile (Linux) compiles also chronojump_mini
parent c3f554e1
......@@ -19,8 +19,10 @@ MCS = gmcs
CHRONOJUMP = chronojump
CHRONOJUMP_DEP_GUI = src/gui/confirm.cs src/gui/error.cs src/gui/jump.cs src/gui/jumpType.cs src/gui/run.cs src/gui/runType.cs src/gui/person.cs src/gui/preferences.cs src/gui/session.cs src/gui/stats.cs src/gui/report.cs src/gui/about.cs src/gui/helpPorts.cs
CHRONOJUMP_DEP_GUI = src/gui/confirm.cs src/gui/error.cs src/gui/jump.cs src/gui/jumpType.cs src/gui/run.cs src/gui/runType.cs src/gui/person.cs src/gui/preferences.cs src/gui/session.cs src/gui/stats.cs src/gui/report.cs src/gui/about.cs src/gui/helpPorts.cs src/gui/dialogMessage.cs
CHRONOJUMP_DEP_STATS = src/statType.cs src/stats/main.cs src/stats/global.cs src/stats/sjCmjAbk.cs src/stats/sjCmjAbkPlus.cs src/stats/djIndex.cs src/stats/djQ.cs src/stats/rjIndex.cs src/stats/rjPotencyBosco.cs src/stats/rjEvolution.cs src/stats/ieIub.cs src/stats/fv.cs src/stats/cmjPlusPotency.cs
CHRONOJUMP_DEP_GRAPHS = src/stats/graphs/graphData.cs src/stats/graphs/graphSerie.cs src/stats/graphs/global.cs src/stats/graphs/sjCmjAbk.cs src/stats/graphs/sjCmjAbkPlus.cs src/stats/graphs/djIndex.cs src/stats/graphs/djQ.cs src/stats/graphs/rjIndex.cs src/stats/graphs/rjPotencyBosco.cs src/stats/graphs/rjEvolution.cs src/stats/graphs/ieIub.cs src/stats/graphs/fv.cs src/stats/graphs/cmjPlusPotency.cs
CHRONOJUMP_DEP_SQLITE = src/sqlite/main.cs src/sqlite/preferences.cs src/sqlite/person.cs src/sqlite/session.cs src/sqlite/jump.cs src/sqlite/jumpType.cs src/sqlite/run.cs src/sqlite/runType.cs src/sqlite/personSession.cs src/sqlite/stat.cs src/sqlite/pulse.cs src/sqlite/pulseType.cs
......@@ -30,16 +32,13 @@ CHRONOJUMP_DEP = src/chronojump.cs src/person.cs src/jump.cs src/jumpType.cs src
RESOURCES = -resource:glade/chronojump.glade,chronojump.glade
CHRONOJUMP_LIB = -pkg:gtk-sharp -pkg:glade-sharp -r:System.Data -r:Mono.Data.SqliteClient
#all: $(CHRONOJUMP).exe chronojump-mini
all: $(CHRONOJUMP).exe
#-- Construccion del chronojump_mini que funciona por consola
CHRONOJUMP_MINI = chronojump_mini
#NAME5= chronojump-mini
#DEP5 = src/chronojump-mini.cs $(DLL_CHRONOPIC).dll
CHRONOJUMP_MINI_DEP = src/chronojump_mini.cs src/catalog.cs chronopic.cs
#-- Construccion del chronojump-mini que funciona por consola
#chronojump-mini: chronojump-mini.exe
all: $(CHRONOJUMP).exe $(CHRONOJUMP_MINI).exe
#-------------------------------
......@@ -49,12 +48,19 @@ all: $(CHRONOJUMP).exe
$(CHRONOJUMP).exe: NPlot.dll NPlot.Gtk.dll $(CHRONOJUMP_DEP)
$(MCS) $(CHRONOJUMP_DEP) $(RESOURCES) -unsafe chronopic.cs -r:NPlot.dll -r:NPlot.Gtk.dll -r:System.Drawing $(CHRONOJUMP_LIB) -nowarn:169 -out:$(CHRONOJUMP).exe
clean::
rm -f $(CHRONOJUMP).exe
#------------------------------------
# Regla para compilar CHRONOJUMP_MINI (C#)
#------------------------------------
$(CHRONOJUMP_MINI).exe: $(CHRONOJUMP_MINI_DEP)
$(MCS) $(CHRONOJUMP_MINI_DEP) -out:$(CHRONOJUMP_MINI).exe
#--------------------------
# REGLAS GENERICAS
#--------------------------
.c.o:
$(CC) $(CFLAGS) -c $<
clean::
rm -f $(CHRONOJUMP).exe $(CHRONOJUMP_MINI).exe
CHANGELOG:
9 may 2006
chronojump and chronojump_mini both work nicely on windows and linux (events, graphs, ...)
Util.IsWindows prints the operating system
In every Chronojump windows start, put "simulated" in preferences (for solving chronojump crashes on windows for not detecting the chronopic
Chronopic doesn't configure DefaultTimeOut if it's on windows (until
we know how to do it)
Before changing to chronopic mode on windows, it's shown a dialog like:
"if it's windows, you have to generate a event with chronopic, if not,
it will crash, restart (simulated automatically) and then select another port".
New class DialogMessage for all kind of dialogs.
Finally used a confirmWindow because then, chronopic is called wen
user clics on accept button.
chronojump-mini now named chronojump_mini (better for Makefile)
chronojump_mini picks port from the user
Makefile (Linux) compiles also chronojump_mini
9 may 2006
windows compatibilty: added chronojump.csproj, chronojump.sln and the
four Nplot dlls for windows
......
......@@ -56,6 +56,7 @@
<Compile Include="src\gui\stats.cs" />
<Compile Include="src\gui\about.cs" />
<Compile Include="src\gui\helpPorts.cs" />
<Compile Include="src\gui\dialogMessage.cs" />
<Compile Include="src\jump.cs" />
<Compile Include="src\jumpType.cs" />
<Compile Include="src\pulse.cs" />
......@@ -182,4 +183,4 @@
<ItemGroup>
<Folder Include="src\stats\report\" />
</ItemGroup>
</Project>
\ No newline at end of file
</Project>
No preview for this file type
......@@ -8,274 +8,275 @@ using System;
using System.IO.Ports;
using System.Threading;
using System.Diagnostics; //for detect OS
using System.IO; //for detect OS
public class Chronopic {
//****************************
// TIPOS PUBLICOS
//****************************
public enum ErrorType
{
Ok = 0, //-- OK. No hay error
Timeout = 1, //-- Error por Timeout
Invalid = 2, //-- Error por recibir caracter invalido
}
//-- Estado de la plataforma
public enum Plataforma : int
{
ON = 1,
OFF = 0,
UNKNOW = -1,
}
//******************************
// CONSTRUCTORES Y DESTRUCTORES
//******************************
//-- Constructor
public Chronopic(SerialPort sp)
{
//-- Comprobar si puerto serie ya estaba abierto
if (sp != null)
//****************************
// TIPOS PUBLICOS
//****************************
public enum ErrorType
{
Ok = 0, //-- OK. No hay error
Timeout = 1, //-- Error por Timeout
Invalid = 2, //-- Error por recibir caracter invalido
}
//-- Estado de la plataforma
public enum Plataforma : int
{
ON = 1,
OFF = 0,
UNKNOW = -1,
}
//******************************
// CONSTRUCTORES Y DESTRUCTORES
//******************************
//-- Constructor
public Chronopic(SerialPort sp)
{
//-- Comprobar si puerto serie ya estaba abierto
if (sp != null)
if (sp.IsOpen)
sp.Close();
//-- Abrir puerto serie
sp.Open();
//-- Configurar timeout por defecto
sp.ReadTimeout = DefaultTimeout;
//-- Guardar el puerto serie
this.sp = sp;
//-- Vaciar buffer
this.flush();
}
//-- Destructor
~Chronopic()
{
//-- Cerrar puerto serie
sp.Close();
}
//***************************************
// METODOS PUBLICOS
//***************************************
//--------------------------------------------------
//-- Leer un evento en Chronopic
//-- Devuelve:
//-- * timestamp : Marca de tiempo
//-- * plataforma: Nuevo estado de la plataforma
//--------------------------------------------------
public bool Read_event(out double timestamp,
out Plataforma plataforma)
{
double t;
//-- Trama de Evento
byte[] trama = new byte[5];
bool ok;
//-- Esperar a que llegue la trama o que se
//-- produzca un timeout
ok = Read_cambio(trama);
//-- Si hay timeout o errores
if (ok==false) {
plataforma = Plataforma.UNKNOW;
timestamp = 0.0;
//xaviBlas. flush
// if(this.error == ErrorType.Invalid) {
// this.flush();
//}
return false;
}
//-- Comprobar que el estado transmitido en la trama es correcto
//-- El estado de la plataforma solo puede tener los valores 0,1
if (trama[1]!=0 && trama[1]!=1) {
//-- Trama erronea
plataforma = Plataforma.UNKNOW;
timestamp = 0.0;
return false;
}
//-- Actualizar el estado
if (trama[1]==0)
plataforma = Plataforma.OFF;
else
plataforma = Plataforma.ON;
//-- Obtener el tiempo
t = (double)((trama[2]*65536 + trama[3]*256 + trama[4])*8)/1000;
timestamp = t;
return true;
}
//----------------------------------------
//-- Obtener el estado de la plataforma
//----------------------------------------
public bool Read_platform(out Plataforma plataforma)
{
//-- Crear la trama
byte[] trama = {(byte)Trama.Estado};
byte[] respuesta = new byte[2];
int n;
int count;
bool status;
//-- Enviar la trama por el puerto serie
sp.Write(trama,0,1);
//-- Esperar a que llegue la respuesta
//-- Se espera hasta que en el buffer se tengan el numero de bytes
//-- esperados para la trama. (para esta trama 2). Si hay un
//-- timeout se aborta
count=0;
do {
n = sp.Read(respuesta,count,2-count);
count+=n;
} while (count<2 && n!=-1);
//-- Comprobar la respuesta recibida
switch(count) {
case 2 : //-- Datos listos
if (respuesta[0]==(byte)Trama.REstado) {
switch (respuesta[1]) {
case 0:
plataforma = Plataforma.OFF;
this.error=ErrorType.Ok;
status=true;
break;
case 1:
plataforma = Plataforma.ON;
this.error=ErrorType.Ok;
status=true;
break;
default:
plataforma = Plataforma.UNKNOW;
this.error=ErrorType.Invalid;
status=false;
break;
}
}
else { //-- Recibida respuesta invalida
plataforma = Plataforma.UNKNOW;
this.error=ErrorType.Invalid;
status=false;
//-- Esperar un tiempo y vaciar buffer
Thread.Sleep(ErrorTimeout);
this.flush();
}
break;
default : //-- Timeout (u otro error desconocido)
status=false;
plataforma = Plataforma.UNKNOW;
this.error=ErrorType.Timeout;
break;
}
return status;
}
/****************************/
/* PROPIEDADES */
/****************************/
public ErrorType Error
{
get {
return this.error;
}
}
//***************************************
// METODOS PRIVADOS
//***************************************
//-- Esperar a recibir una trama de cambio de estado
private bool Read_cambio(byte[] respuesta)
{
//-- Crear la trama
int n;
int count;
bool status;
//-- Esperar a que llegue la respuesta
//-- Se espera hasta que en el buffer se tengan el numero de bytes
//-- esperados para la trama. (En el caso de id son 4). Si hay un
//-- timeout se aborta
count=0;
do {
n = sp.Read(respuesta,count,5-count);
count+=n;
} while (count<5 && n!=-1);
//-- Comprobar la respuesta recibida
switch(count) {
case 5 : //-- Datos listos
if (respuesta[0]==(byte)Trama.Evento) { //-- Trama de evento
this.error=ErrorType.Ok;
status=true;
}
else { //-- Recibida trama invalida
this.error=ErrorType.Invalid;
status=false;
//-- Esperar un tiempo y vaciar buffer
Thread.Sleep(ErrorTimeout);
this.flush();
}
break;
default : //-- Timeout (u otro error desconocido)
status=false;
this.error=ErrorType.Timeout;
break;
}
return status;
}
//-- Vaciar buffer de entrada
//-- De momento se hace leyendo muchos datos y descartando
private void flush()
{
byte[] buffer = new byte[256];
sp.Read(buffer,0,256);
}
/**********************************/
/* TIPOS PRIVADOS */
/**********************************/
//-- Identificacion de las tramas
private enum Trama
{
Evento = 'X', //-- Trama de evento
Estado = 'E', //-- Trama de solicitud de estado
REstado = 'E', //-- Trama de respuesta de estado
}
/*********************************************************************/
/* CONSTANTES PRIVADAS */
/*********************************************************************/
private const int DefaultTimeout = 100; //-- En ms
private const int ErrorTimeout = 500; //-- En ms
//------------------------------
// Propiedades privadas
//------------------------------
//-- Puerto serie donde esta conectada la Chronopic
private SerialPort sp;
//-- Ultimo error que se ha producido
private ErrorType error = ErrorType.Ok;
//-- Abrir puerto serie
sp.Open();
//-- Configurar timeout por defecto
//de momento no en windows (hasta que no encontremos por qué falla)
OperatingSystem os = Environment.OSVersion;
if( ! os.Platform.ToString().ToUpper().StartsWith("WIN"))
sp.ReadTimeout = DefaultTimeout;
//-- Guardar el puerto serie
this.sp = sp;
//-- Vaciar buffer
this.flush();
}
//-- Destructor
~Chronopic()
{
//-- Cerrar puerto serie
sp.Close();
}
//***************************************
// METODOS PUBLICOS
//***************************************
//--------------------------------------------------
//-- Leer un evento en Chronopic
//-- Devuelve:
//-- * timestamp : Marca de tiempo
//-- * plataforma: Nuevo estado de la plataforma
//--------------------------------------------------
public bool Read_event(out double timestamp,
out Plataforma plataforma)
{
double t;
//-- Trama de Evento
byte[] trama = new byte[5];
bool ok;
//-- Esperar a que llegue la trama o que se
//-- produzca un timeout
ok = Read_cambio(trama);
//-- Si hay timeout o errores
if (ok==false) {
plataforma = Plataforma.UNKNOW;
timestamp = 0.0;
return false;
}
//-- Comprobar que el estado transmitido en la trama es correcto
//-- El estado de la plataforma solo puede tener los valores 0,1
if (trama[1]!=0 && trama[1]!=1) {
//-- Trama erronea
plataforma = Plataforma.UNKNOW;
timestamp = 0.0;
return false;
}
//-- Actualizar el estado
if (trama[1]==0)
plataforma = Plataforma.OFF;
else
plataforma = Plataforma.ON;
//-- Obtener el tiempo
t = (double)((trama[2]*65536 + trama[3]*256 + trama[4])*8)/1000;
timestamp = t;
return true;
}
//----------------------------------------
//-- Obtener el estado de la plataforma
//----------------------------------------
public bool Read_platform(out Plataforma plataforma)
{
//-- Crear la trama
byte[] trama = {(byte)Trama.Estado};
byte[] respuesta = new byte[2];
int n;
int count;
bool status;
//-- Enviar la trama por el puerto serie
sp.Write(trama,0,1);
//-- Esperar a que llegue la respuesta
//-- Se espera hasta que en el buffer se tengan el numero de bytes
//-- esperados para la trama. (para esta trama 2). Si hay un
//-- timeout se aborta
count=0;
do {
n = sp.Read(respuesta,count,2-count);
count+=n;
} while (count<2 && n!=-1);
//-- Comprobar la respuesta recibida
switch(count) {
case 2 : //-- Datos listos
if (respuesta[0]==(byte)Trama.REstado) {
switch (respuesta[1]) {
case 0:
plataforma = Plataforma.OFF;
this.error=ErrorType.Ok;
status=true;
break;
case 1:
plataforma = Plataforma.ON;
this.error=ErrorType.Ok;
status=true;
break;
default:
plataforma = Plataforma.UNKNOW;
this.error=ErrorType.Invalid;
status=false;
break;
}
}
else { //-- Recibida respuesta invalida
plataforma = Plataforma.UNKNOW;
this.error=ErrorType.Invalid;
status=false;
//-- Esperar un tiempo y vaciar buffer
Thread.Sleep(ErrorTimeout);
this.flush();
}
break;
default : //-- Timeout (u otro error desconocido)
status=false;
plataforma = Plataforma.UNKNOW;
this.error=ErrorType.Timeout;
break;
}
return status;
}
/****************************/
/* PROPIEDADES */
/****************************/
public ErrorType Error
{
get {
return this.error;
}
}
//***************************************
// METODOS PRIVADOS
//***************************************
//-- Esperar a recibir una trama de cambio de estado
private bool Read_cambio(byte[] respuesta)
{
//-- Crear la trama
int n;
int count;
bool status;
//-- Esperar a que llegue la respuesta
//-- Se espera hasta que en el buffer se tengan el numero de bytes
//-- esperados para la trama. (En el caso de id son 4). Si hay un
//-- timeout se aborta
count=0;
do {
n = sp.Read(respuesta,count,5-count);
count+=n;
} while (count<5 && n!=-1);
//-- Comprobar la respuesta recibida
switch(count) {
case 5 : //-- Datos listos
if (respuesta[0]==(byte)Trama.Evento) { //-- Trama de evento
this.error=ErrorType.Ok;
status=true;
}
else { //-- Recibida trama invalida
this.error=ErrorType.Invalid;
status=false;
//-- Esperar un tiempo y vaciar buffer
Thread.Sleep(ErrorTimeout);
this.flush();
}
break;
default : //-- Timeout (u otro error desconocido)
status=false;
this.error=ErrorType.Timeout;
break;
}
return status;
}
//-- Vaciar buffer de entrada
//-- De momento se hace leyendo muchos datos y descartando
private void flush()
{
byte[] buffer = new byte[256];
sp.Read(buffer,0,256);
}
/**********************************/
/* TIPOS PRIVADOS */
/**********************************/
//-- Identificacion de las tramas
private enum Trama
{
Evento = 'X', //-- Trama de evento
Estado = 'E', //-- Trama de solicitud de estado
REstado = 'E', //-- Trama de respuesta de estado
}
/*********************************************************************/
/* CONSTANTES PRIVADAS */
/*********************************************************************/
private const int DefaultTimeout = 100; //-- En ms
private const int ErrorTimeout = 500; //-- En ms
//------------------------------
// Propiedades privadas
//------------------------------
//-- Puerto serie donde esta conectada la Chronopic
private SerialPort sp;
//-- Ultimo error que se ha producido
private ErrorType error = ErrorType.Ok;
}
This diff is collapsed.
......@@ -159,7 +159,7 @@ public class ChronoJump
[Widget] Gtk.Notebook notebook;
[Widget] Gtk.ProgressBar progressBar;
private Random rand;
private static string [] authors = {"Xavier de Blas", "Juan Gonzalez"};
......@@ -260,6 +260,8 @@ public class ChronoJump
private string rjTvString;
private bool createdStatsWin;
private bool preferencesLoaded;
//const int statusbarID = 1;
......@@ -277,7 +279,9 @@ public class ChronoJump
Application.Init();
Console.Write("C");
Util.IsWindows(); //only as additional info here
Glade.XML gxml;
try {
//linux
......@@ -304,10 +308,13 @@ public class ChronoJump
Console.WriteLine ( Catalog.GetString ("tables already created") );
//check for bad Rjs (activate if program crashes and you use it in the same db before v.0.41)
//SqliteJump.FindBadRjs();
}
//start as "simulated" if we are on windows
//(until we improve the Timeout on chronopic)
if(Util.IsWindows())
SqlitePreferences.Update("simulated", "True");
cpRunning = false;
report = new Report(-1); //when a session is loaded or created, it will change the report.SessionID value
......@@ -316,7 +323,12 @@ public class ChronoJump
//but check what happens if report window is opened
Console.Write("G");
//preferencesLoaded is a fix to a gtk#-net-windows-bug where radiobuttons raise signals
//at initialization of chronojump and gives problems if this signals are raised while preferences are loading
preferencesLoaded = false;
loadPreferences ();
preferencesLoaded = true;
createTreeView_persons(treeview_persons);
createTreeView_jumps(treeview_jumps);
......@@ -1298,7 +1310,7 @@ public class ChronoJump
private void on_paste1_activate (object o, EventArgs args) {
}
void on_radiobutton_simulated_activate (object o, EventArgs args)
void on_radiobutton_simulated (object o, EventArgs args)
{
simulated = true;
SqlitePreferences.Update("simulated", simulated.ToString());
......@@ -1310,8 +1322,37 @@ public class ChronoJump
cpRunning = false;
}
void on_radiobutton_chronopic_activate (object o, EventArgs args)
void on_radiobutton_chronopic (object o, EventArgs args)
{
if(! preferencesLoaded)
return;
if(! menuitem_chronopic.Active) {
Console.WriteLine("INACTIVE");
return;
}
Console.WriteLine("ACTIVE");
//on windows currently there's no timeout on init of chronopic
//show this window, and start chronopic only when button_accept is clicjed
if(Util.IsWindows()) {
ConfirmWindow confirmWin = ConfirmWindow.Show(app1, Catalog.GetString("** Attention **:</b> generate a event with the platform or with chronopic.\nIf you don't do it, Chronojump will crash.\n"), Catalog.GetString("If crashes, try to close it and open again, then Chronojump will be configured as simulated, and you can change the port on preferences window"));
confirmWin.Button_accept.Clicked += new EventHandler(on_chronopic_accepted);
confirmWin.Button_cancel.Clicked += new EventHandler(on_chronopic_cancelled);
} else {
simulated = false;
SqlitePreferences.Update("simulated", simulated.ToString());
//init connecting with chronopic
if(cpRunning == false) {
chronopicInit(chronopicPort);
cpRunning = true;
}
}
}
private void on_chronopic_accepted (object o, EventArgs args) {
simulated = false;
SqlitePreferences.Update("simulated", simulated.ToString());
......@@ -1322,6 +1363,12 @@ public class ChronoJump
}
}
private void on_chronopic_cancelled (object o, EventArgs args) {
menuitem_chronopic.Active = false;
menuitem_simulated.Active = true;
}
private void on_preferences_activate (object o, EventArgs args) {
PreferencesWindow myWin = PreferencesWindow.Show(
app1, chronopicPort, prefsDigitsNumber, showHeight, showInitialSpeed,
......
......@@ -12,6 +12,7 @@
--------------------------------------------------------------------------*/