Se corrige el bug que hacia que aparezca un error EADDRINUSE (que el puerto ya
estaba siendo utilizado) cuando el server se cerraba con conexiones y se trataba
de comenzar de nuevo enseguida.
Varios cambios:
- Se empiezan a emprolijar las cosas, empezando por Runnable:
* Se ponen atributos y signals como privados y se agrega mutex.
* El thread que usa ahora no es joinable, por lo que finish() ahora no
lleva argumentos.
- Se arreglan todas las otras clases (y el programa principal) para que anden
con el nuevo Runnable (haciendo loops de espera cuando deben 'joinear' un
thread).
- Se actuliza el plaqui-client y se le arreglan un par de bugs (ya anda la
opcion desconectar del menu).
- Se implementa el comando /server/stop por completo (usando una conexion
suicida para salir del accept()).
- Se agregan separadores de tipos, constantes, atributos y metodos mas
llamativos :)
* Se agrega el tanque la suma de color (no me gusta como esta, vere si la puedo hacer mas linda)
* El cliente ahra tiene un boton On/Off que apaga o enciende un elemento
dependiendo de su estado actual. Anda para cualquier objeto, despues
voy a filtrar para que solo se pueda usar en exclusa y bomba.
Es muy lindo apagar la bomba de arriba a la derecha y ver como se vacia
el tanque, y cuando se vuelve a encender se llena :-)
* Todos los items, menos el tanque, ya actualizan bien los colores
* El cliente ya muestra bien todos los cambios de color (en el ejemplo
solo se aprecia en la union, que suma rojo+negro)
* Al desconectar se envian /connection/stop/get_host()/7522 pero recibo
un error 404
* Se agrega un poco de color al ejemplo
Faltaría ver si el server ya acepta abrir o cerrar bombas/exclusas de forma manual
para implementarlo en el cliente. Mañana miro el codigo, no toy para leer nada :-)
- Se corrige el bug que hacia que no se deje de transmitir con el comando
/transmission/stop/.
- Aparentemente tambien se arregla el bug de desconexion del cliente (pero no
estoy seguro, despues de cambiar varias cosas creo que al final quedo como al
principio).
* Se completa el cliente. Ya muestra todas las propiedades y el ultimo item que
se selecciono se va actualizando automaticamente
* Se pone por default el puero 7522 en el Cliente
* Se modifica el XML de prueba para llegar a ver como se actualiza el tanque.
Hay un bug en la Division (maldita sea!), vere si llego a encontrar que es antes de mañana.
Se arregla bug en la union que hacia que el flujo inicial este en 0, y eso condicionaba todo el
circuito armado a andal mal.
Ahora el ejemplo del server corre como trompada
* El cliente ahora refleja un poco mejor los datos del server
* Se agregan verificaciones varias para conexion != NULL (se sigue colgando el desconectar)
Se corrigen varios bugs en el parseo del XML de un frame :
* Se estaba buscando propiedad nombre, cuando en realidad se llama name :-)
* Se corrigen los punteros que se utilizan en cada etapa del parseo,habia
cosas mal utilizadas
Ya se puede ver como se actualizan los flujos de los caños!!!!!!!!
En un rato comienzo a poner los otros elementos, tanto en el modelo como en
el cliente
Se emprolija un poco:
- Se mejora mucho el manejo y deteccion de errores.
- Tambien se mejora la informacion de debug poniendo el numero de linea.
- Se pone en todos los objetos que se conectan la parte de la conexion en el
constructor para que pueda capturarse una eventual excepcion.
- Se crea una nueva signal_error para avisar sobre cualquier error que pase en
el run() que no puede lanzar excepciones.
Nicolás Dimov [Wed, 19 Nov 2003 21:23:21 +0000 (21:23 +0000)]
-Los cables que van a las compuertas se posicionan en la entrada o salida y no en la punta de la imagen
-Las compuertas se guardan en el xml con un formato discutible
-muchas cosas quedan por arreglar pero creo que para maniana sirve
-Las compuertas no validan del todo bien su conexionado
-todavia no se pueden conectar compuertas ente si.
Use un criterio de conexion entre compuertas e items medio pedorro
porque la salida de una compuerta siempre se conecta a la entrada de un item y
alreves, la entrada de una compuerta siempre se conecta a la salida de un item.
Esto puede llegar a traer algunas imposibilidades de conexion. lo voy a tener que pensar
con mas tiempo..
Nicolás Dimov [Wed, 19 Nov 2003 03:35:04 +0000 (03:35 +0000)]
-se pueden tirar cables de una manera mas comoda pero como diria TU SAM puede fallar...
MODO DE USO
-accionar el boton logica
-click en una compuerta
-click en la entrada o salida de un item
esto es:
exclusa entrada: al medio y arriba (en el pingorcho)
salida: al medio y abajo
bomba entrada: (en el conector) la mitad superior
salida: mitad inferior
tanque entrada conector superior
salida conector inferior
todo esto es aproximado
igual se van a dar cuenta
ojo que las primeras lineas las tira en cualquier lado (no se por que)
pero cuando rota el item se acomodan
-Se cuelga bastante, asi que tengan cuidado
intenten eliminar lo menos posible
- Se agrega el metodo Model::Simulator::set_open() para abrir y cerrar bombas y
exclusas.
- Se actualiza el server para usarlo y se implementa el comando /plant/set/.
- Se limpia un poco mas las respuestas, ahora son todas (?) XML aunque no
definitivas.
- Se agrega una funcion templateada to() para convertir de un tipo de dato
arbitrario a otro a traves de un stringstream (similar a String::to()).
- Se usa la nueva funcion en varios lugares.
- Se limpian un poco las respuestas, ahora lo que van a ser respuestas reales,
se manda en XML.
- Se implementa el esqueleto del comando /plant/set. Me falta conocer algunos
detalles de que y como setear las cosas para terminarlo.
Se carga la planta al conectarse. Falla cada tanto, no puedo determinar por que.
Al parecer es un problema de threads dentro de la Gtk+, pero no puedo entender
por que cuando cargo del archivo anda bien, y cuando cargo desde memoria
anda mal!!!
Nicolás Dimov [Tue, 18 Nov 2003 22:25:37 +0000 (22:25 +0000)]
-Se arregla lo del id cuando se carga una planta
-si esta checkeado el boton "logica" haciendo click sobre una compuerta y luego sobre
un item, tira un cable
-si se elimina un item, los cables se borran
-se muevene todos juntos cables+items, pero al rotar un item conectado me falta hacer un repinte
ya lo van a ver...
-el constructor tiene un metodo para borrar todos los itmes pero no hay boton para llamarlo (depues lo pongo)
pero igual la funcion es llamada en el destructor del constructor (con esa los mate)
-en el tanque la bomba y la exclusa los cables se conectan en una posicion mas linda (por lo menos en la exclusa)
-para los cables que salen de las compuertas se me ocurrio discriminar por la posicion donde se clickea en la misma
aunque eso se me hace que va a ser medio incomodo porque son pequenias, pero me parece que estaria bueno igual
-mirenlo y pasen los bugs!
Se corrige un bug en la carga del XML. Me habia olvidado que hay elementos con 3 entradas
y yo solo leia hasta 2 :-) ... ahora el ejemplo por defecto carga y corre
joya.
* Se agrega carga de una planta desde un XML (Archivo->Abrir)
* Se saca el menu Guardar Como
* Se hacen todos los dialogos Modal
TODO :
* cargar el color de la bomba y el tanque desde el XML
* eliminar la planta actual cuando se abre una nueva (para que no quede basura)
* Poner cartelitos de "Uds no ha salvado su trabajo pedaso de idiota, desea hacerlo ahora?"
* Seguro que algo se me escapa ahora :-)
El ControlClient ya puede recibir "frames" con el estado de la planta! :-D
Esta hecho un poco a las patadas, pero asi puedo laburar un poco mas tranquilo
sabiendo que no trabo el avance del cliente grafico.
El Receiver se levanta cuando se crea el ControlClient, asi que todo lo que hay
que hacer es mandar un comando /transmission/start/default/localhost/7528 para
que empiece a transmitirnos el server (bueno, localhost si corre local).
Se actualiza el ejemplo para tener de referencia (igual todo lo que hay que
hacer es atender la signal_frame_received(const std::string& frame) que entrega
el XML del frame recibido).
* Se modifica la estructura de directorios : src include dialogs y pixmaps
* Se generan Makefiles.am para cada directorio
Bien, ahora el constructor ya se compila e instala utilizando autoconf y
automake.
Para compilar la primera vez :
#> aclocal
#> autoconf
#> automake -a
Con eso se crean loa Makefile.in en cada directorio y el script confugure.
El programa debe ser instalado ahora para poder ser usado. Cuando se corre
configure, por default se toma como path de instalacion el /usr/local (seria el
PREFIX).
El ejecutable queda en PREFIX/bin y los datos en :
* dialogos (.glade e imagenes que tienen definido el .glade adentro ) :
PREFIX/share/plaqui-constructor/dialogs
* pixmaps : PREFIX/share/plaqui-constructor/pixmaps
El codigo fue adaptado para que busque las cosas en esos directorio, por eso sin
instalar no va a funcionar el programa. Si se quiere cambiar el /usr/local por
otro dir, se le debe pasar al configure :
#>./configure --prefix=/path/to/install
Yo por ejemplo lo tengo asi :
#>./configure --prefix=/home/gazer/local
para tener un directorio de prueba (local debe ser creado) ...
El modelo ya carga el XML completo, completo (todos los items y sos
propiedades) y ademas carga de forma correcta las conexiones de
toooodddooossss los items y genera un modelo funcional y que simula :-)
Esto es un paso importante, ya que si ahora sacamos el modelo entre hoy y
mañana ya tenemos el TP terminado, salvando detalles y bugs que aparezcan.
- Se levanta una planta por defecto desde un archivo (prueba.xml).
- El server ahora acepta dos parametros (opcionales): planta y puerto.
planta: Nombre del archivo XML de la planta (por defecto prueba.xml).
puerto: Puerto donde escuchar (por defecto 7522)
Nicolás Dimov [Mon, 17 Nov 2003 21:36:50 +0000 (21:36 +0000)]
-Se conectan como trompada!!!!!
-ahora voy a hacer que se tiren cablecitos entre las compuertas y los items (tanque, exclusa, y algo mas?)
-miren el xml que larga, y diganme que les parece.
- Se agrega una planta de prueba (usando Simulator).
- En teoría ya andan los siguientes comandos:
* (A) /server/status
* /server/stop (mandandole una segunda conexion para que muera)
* (A) /connection/list
* (A) /connection/stop/<host>/<port>
* (A) /transmission/list
* /transmission/start/<planta>/<host>/<port>
* /transmission/stop/<host>/<port>
* (A) /plant/list
* (A) /plant/stop/<planta>
Los que dicen (A) estan minimamente probados y andando bien. Los de
transmision no los pude probar todavia porque me falta hacer la parte del
cliente.
En realidad no anda ninguno porque todavia no mandan XML :-D
- Ahora las transmisiones son de la planta no del server (cosa que no me
termina de agradar pero me simplificaba un poco las cosas).
Se agrega un parametro *provisorio* body a la signal_ok_received para obtener
el cuerpo del mensaje. Se corrige el port y host para que una vez que se conecta
devuelva el host y port local (en vez de a donde nos conectamos).
* Simulador ==> Simulator fixed
* El simulador levanta una planta de un XML (no va a funcionar hasta que el XML
este completo, con conexiones y todo)
* Model : verifica en el configure que exista la libxml2
* Cambios de cara en el Cliente, se escuchan las señales "conected" y
"finished"
* Cliente carga todos los widgets (falta exclusa!)
* Los Items ahora son Gtk::EventBox con una imagen dentro, para poder atender
los clicks
* El cliente ya casi esta tarminado, en cuanto a visualizar una planta se
refiere. Falta agregar escuchar al server
- Se mejora el manejo de errores (excepciones) en los tests (y en algunas otras
clases, pero falta). Ahora se manda bien la ControlClient::signal_connected()
cuando se conecta (bien) y ControlClient::signal_finished() cuando no se puede
conectar (o cuando se desconecta). La signal_connected() para mi pierde
sentido con la existencia de la signal_finished() pero se deja por las dudas.
- Se arregla un bug en la prueba del cliente (daba segfault si se desconectaba).
- Se agrega host y port a Connection, cambiandose los metodos get_peerhost() y
get_peerport() por get_host() y get_port().
- Se agrega un esqueleto muy (pero muy) primitivo de la planta y la lista de
plantas al servidor.
- Se mejora el "switch" de comandos del Server.
- Se implementa el comando connection/stop.
- Se agregan metodos de conversion a distintos tipo (con templates) al String.
- Se crea un tipo Connection::Port para ser consistente a la hora de usar
numeros de puertos (antes usaba a veces int y a veces unsigned, en realidad
faltan "migrar" cosas todavia).
- TODO actualizada. :)
* Se agrega ejemplo de carga desde un archivo XML. Para operar, copiar un xml
al directorio del ejecutable, renombrarlo como text.xml, luego cargar la
aplicacion e ir al menu Ver->Propiedades. Esto carga solo las bombas y los
codos que tenga el circuito por ahora !
* Se agregan las imagenes en /pixmaps (por ahora copien codo_*.png y
bomba*.png al directorio src para poder cargar del XML)