* 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)
- Se agrega una signal_connected al ControlClient (por ahora dummy).
- Se agrega un parámetro a la signal_error_received con un codigo de error.
- Se actualiza el ejemplo y agrega el ejemplo (ouch! perdon ricky, me habia
olvidado de subirlo!).
Nicolás Dimov [Thu, 13 Nov 2003 17:57:15 +0000 (17:57 +0000)]
agrego las compuertas pero todavia no hacen nada, ademas tengo un conflicto con el conexionado del tubo y no encuentro la falla, pero deberia estar en Conduct::check_connection()
El cliente ya se conecta, muestra en un campo de texto el log de lo que se esta
haciendo, y tienen un campo de texto y un boton para mandar URI a manopla. No
se si estoy usando bien el command (seguramente no), y no se que comando andan,
ya que todo lo que probe me da error :-)
* Se agrega un Tanque al ejemplo, y ANDA!!!!
* Se agrega un metodo (temporal) para apagar bombas (utiliza RTTI!)
* Los headers estan un poco mas comentados
- Se agrega el método HTTPRequest::method_str() para obtener el método como un
string.
- Se arreglan algunos bugs de llamadas a constructores con parametros viejos.
- Se agrega un test minimamente funcional del ControlClient (tiene un bug
soportable).
- Se arreglan algunas otras cosas para que el ControlClient ande (aunque sea
mal :-/).
- Se agrega una TODO list :)
* Se corrige bug en tanque para que compile
* Se sube atributo actual_flow hasta platitem (al igual que sus metodos), ya
que estaba redefinido en todos lados
- Se sobreescribe el método Connection::finish() para que cierre el socket.
- Se elimina el mutex para el socket (comentado por ahora).
- Se implementan rudimentariamente algunos comandos del servidor:
/server/status, /server/stop, /connection/list.
- Se empieza a implementar el ControlClient, agregando algunas señales que
probablemente no sean las definitivas.
- Se comienza a implementar la obtención del cuerpo del mensaje en HTTPMessage.
- Se actualiza la documentación.
Seguramente no compila.
Nicolás Dimov [Wed, 12 Nov 2003 17:55:52 +0000 (17:55 +0000)]
el conexionado se verifica pero hay casos en que falla, estaria bueno que hagan algunas pruebas para ver si
entre todos podemos descubrir cual es el item que me trae problemas.
me imagino que para poder descubrir esto tendrian que ver la implementacion, pero cualquier cosa se las cuento hoy a la noche, igual es facil pero medio ilegible.
Otra cosa, mas que nada para Richard, los items te los mando conectados o los conectas vos???
a mi me parcee que si los conecto yo tendrias una tarea engorrosa menos en el cliente, decime vos..
nada mas
Pocos cambios a la vista del "usuario":
- Ya se envían comandos con la señal command_received() apropiadamente.
- Las respuestas son asincrónicas, ya que los comandos van a encolarse para
esperar que el modelo se actulice.
- Ya se pueden enviar respuestas via ControlServer::send().
Muchos cambios internos entre los que se destacan el correcto funcionamiento de
las excepciones (que venía postergado).
Se modelo queda terminadoooooooooooooo. Hice todas las pruebas posibles y la
union se comporta de manera correcta en todos los casos.
Se estabiliza el modelo, aunque tengo que hacer un par de cambios en otras
clases.
Nicolás Dimov [Tue, 11 Nov 2003 03:58:20 +0000 (03:58 +0000)]
ya no me acuerdo ni que cambie, pero va tomando forma esto, si el circuito que se arma es cerrado esta todo ok, si no te aparece un dialoguito que te dice que esta todo mal
- Se agrega el objeto Command que encapsula un comando enviado al servidor.
- Se actualiza el controlserver para que use Command.
- Se agregan funciones split() y join() a String.
- Se corrigen bugs insignificantes.
Nicolás Dimov [Sat, 8 Nov 2003 21:20:59 +0000 (21:20 +0000)]
estoy completando un poco todo esto para ponerme a implementar el guardar y cargar, pero tengo un quilombo con las referencias cruzadas (creo) y no compila. Lo raro es que es un caso totalmente analogo a otro que si anda. si pueden peguenle una mirada rapida para ver si se dan cuenta donde esta el error.
* Se agrega una exclusa al ejemplo a la salida de la bomba.
* Se conecta la logica de control de la exclusa con la bomba. Ahora en lugar
de apagar la bomba, cierro la exclusa, lo que deriva en que la bomba se apague
:-)
* Agrego lógica de control al modelo!!. Implementadas :
- And
- Or
- ByPass
- LogicControl (Abstracta)
* Pump y Exclusa ya tiene sus ByPass funcionando a pleno :-)