Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



lunes, 28 de noviembre de 2011

¿tu contraseña es segura? Comprobador de Contraseñas/Password


¿como saber si nuestra
 contraseña es segura?

Esta es una dirección web que me ha pasado jguardon, el administrador del foro de gambas-es.org ,  para comprobar si nuestras contraseñas son seguras:





Saludos

sábado, 19 de noviembre de 2011

Gambas: Convenciones Acerca de Nombres de Variables

En este enlace del gambasdoc, podeis ver reglas para nombrar variables, algo muy interesante para facilitar compartir códigos:




Prefijos convenidos para tipos comunes de variables

Tipo de variablePrefijo
Integeri
Floatf
Booleanb
Bytebt
Shortsh
Longl
Singlesng
Variantv
Pointerptr
Strings
Datedate
Objecto

Prefijos convenidos para matrices o colecciones

Tipo de variablePrefijo
Matriz estáticaar + prefijo de tipo
Integer[]ari
Float[]arf
Boolean][]arb
Byte][]arbt
Short[]arsh
Long[]arl
Single[]arsng
Variant[]arv
String[]ars
Date[]ardate
Object[]aro
Collectioncol

Tipos especiales

Tipo de variablePrefijo
Filefi
Processproc

Prefijos de ejemplo para algunos componentes

Tipo de variablePrefijo
Formfrm
TextBoxtxtb
TextAreatxta
ListBoxlstb
ComboBoxcbo
Timertmr
Buttonbut
ToggleButtontglbut
ToolButtontbut

Como comprobar si ya esta ejecutandose el mismo programa: comando PS y Gambas


Comando ps en Gambas

Algunas veces nos interesa saber si nuestro programa se esta ejecutando por una 2º vez.
En gnu/linux, tenemos el comando "ps" que nos muestra los programas que se esten ejecutando, con el argumento "a", nos va a mostrar todas los programas que se esten ejecuntado en las distintas terminales.



¿como poder usar este comando en Gambas?
Una opción es usarlo con el comando "Shell", por ejemplo, creo un modulo llamado "comprobar" y este es su codigo:

' Gambas module file
' nombre: es el nombre de la aplicacion que estamos buscando ver si esta ejecutandose 2 veces.
PUBLIC SUB ejecucion(nombre AS String) AS Boolean
DIM texto AS String
DIM buscar AS Integer
DIM buscar2 AS Integer

SHELL ("ps a >" & User.home & "/temporal.process") WAIT

texto = File.Load(User.home & "/temporal.process")
KILL User.home & "/temporal.process" ' para no dejar restos
buscar = InStr(texto, nombre)
IF buscar <> 0 THEN
buscar2 = InStr(Mid$(texto, buscar + Len(nombre), Len(texto)), nombre)
IF buscar2 <> 0 THEN
'se ha encontrado una 2º ejecucion
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
ENDIF
RETURN FALSE
END


En este código con la orden: SHELL ("ps a >" & User.home & "/temporal.process") WAIT
vamos a crear un archivo "temporal.proccess", que va a contener la salida que genera el "ps a" (para ello usamos el redireccionamiento ">".

luego cargamos el contenido de este archivo en la variable texto:
texto = File.Load(User.home & "/temporal.process")
Y empazamos a analizalo:
Primero buscamos si existe dentro de "texto", el contenido de la variable "nombre"
buscar = InStr(texto, nombre)
Si lo encuentra (busca es distinto a cero), procede a otro busqueda, entre el resto del texto y el total de la longitud, buscando el contenido de la variable "nombre"
buscar2 = InStr(Mid$(texto, buscar + Len(nombre), Len(texto)), nombre)
Y si busca2 tambien es distinto a cero, entonces eso indica que has por lo menos 2 veces, y por lo tanto 2 ejecuciones.

Para usar este procedimiento:
.....

if comprobar.ejecucion("hola.gambas") then  Message.Info("Se esta ejecutando por lo menos 2 veces")

.....



Descarga del Codigo fuente


Saludos.

Fuente:
https://sites.google.com/site/fpoprogramadorsistemas/sistemas-de-procesos-en-gnu-linux

Enlaces de interes:
Instr
Shell
file.load
Foro: Gambas es org: Permitir Una Sola Ejecución.

viernes, 18 de noviembre de 2011

Mi primera aplicacion con Gambas y Arduino


Arduino y Gambas
Mi primera aplicación

Hoy os traigo mi primera aplicación con Gambas y Arduino.
Es algo muy sencillo,el tipico encendido de led y apagado, pero bueno... por algun lado hay que empezar... :)

Hay que diferenciar 2 partes:
La programación de arduino:
Lo primero que hace es conectarse al puerto serie a una velocidad 9600, y mandar un mensaje "Conectado con el Arduino.Hello world". Luego entra en un loop, donde según reciba el valor "1" o "0", enciende o apaga el led conectado al puerto 13, enviando el correspondente mensaje al puerto de serie de "Arduino: He apagado/encendido el led 13"

int dato;
void setup()
{
// Inicializamos puerto serie a 9600 bps
Serial.begin(9600);
pinMode(13, OUTPUT);
// Enviamos "Hello World" con salto de línea al final
Serial.println("Conectado con el Arduino. Hello world!");
//arduino manda esta cadena al PC
}
void loop()
{
//¿Existen datos por el puerto serie?
if (Serial.available()) {
//Guardamos el dato por la variable dato
dato=Serial.read();
// Serial.println(dato);
switch (dato) {
case 49:
// escribo 1 en el PC y lo envio
//Apagamos el led 13
digitalWrite(13,LOW);
Serial.println("Arduino: He apagado el led 13");
break;
case 48:
// escribo 0 en el PC y lo envio al arduino
//Encendemos el led 13
digitalWrite(13,HIGH);
Serial.println("Arduino: He encendido el led 13");
break;
}
}
}


Por otro lado esta el programa en gambas (basado en el ejemplo que trae gambas sobre el puerto serie):

Lo que hace el programa es configurar el puerto serie, y esperar al que el usuario pulse el boton de "Abrir" que se encarga de abrir el puerto y dejar las propiedade del boton de icono led verde activo, para que podamos pulsar sobre el.

Cuando pulsas sobre el boton, manda un mensaje al arduino, el mensaje varia si esta encendido o apagado (variable "encendido")


' Gambas class file
PUBLIC encendido AS Boolean

PUBLIC SUB Form_Close()
IF Sport.Status = Net.Active THEN CLOSE Sport
END

PUBLIC SUB Button1_Click()
IF Sport.Status = Net.Active THEN
CLOSE Sport
Button1.Text = "Abrir"
Label3.Enabled = FALSE
ToolButtonLed.enabled = FALSE
ELSE
' Line parameters
Sport.PortName = TxtPort.Text
Sport.Speed = CmbSpeed.Text
Sport.Parity = CmbParity.Index
Sport.DataBits = CmbData.Text
Sport.StopBits = CmbStop.Text
' keep DTR on
Sport.FlowControl = ComboBox1.Index
Sport.Open()

TextArea1.Text = "Port Abierto : " & Sport.PortName & " Settings : " &
Sport.Speed & "," & Sport.Parity & "," & Sport.DataBits & "," &
Sport.StopBits & Chr(13) & Chr(10)
Button1.Text = "Cerrar"
Label3.Enabled = TRUE
ToolButtonLed.enabled = TRUE
END IF
END

PUBLIC SUB SPort_Read()
DIM s AS String
READ #Sport, s, Lof(Sport)
TextArea1.Text = TextArea1.Text & s
END


PUBLIC SUB ComboBox1_Click()
Sport.FlowControl = ComboBox1.Index
END


PUBLIC SUB Form_Open()
ME.center
cmbSpeed.Index = cmbSpeed.Find("9600")
END


PUBLIC SUB ToolButtonLed_Click()
IF encendido = FALSE THEN
TRY PRINT #Sport, "0" 'enciendo led
IF ERROR THEN Message.Error("tienes que abrir el puerto")
ToolButtonLed.Picture = Picture["ledVerdeEncendido.jpg"]
encendido = TRUE
ELSE
PRINT #Sport, "1" 'apago led
ToolButtonLed.Picture = Picture["ledVerdeApagado.jpg"]
encendido = FALSE
ENDIF
END

Os dejo un video para que veais como funciona:




Codigo fuentes:
Arduino: puertoSerieEncendidoYapagado.pde
Gambas: SerialPort-Arduino 0.0.18.tar.gz

fuentes:
 Me he basado en las explicaciones de este blog:
http://www.craswer.net/2011/02/arduino-y-puerto-serie/
Y en el ejemplo que trae gambas2 sobre el puerto serie.

Nota: 22/01/2012
Lo que esta leyendo el arduino es la "salida" que genera la aplicación Gambas.

Gambas le envia un caracter "1" o "0" (no el número el 1 o 0).

El caracter "0" corresponde en la tabla ASCII al 48,
Y el caracter "1" corresponde en la tabal ASCII al 49

Por eso el tema de usar el  48 y el 49 en el código de Arduino.

Nota:
Una entrada interesante sobre lectura de entras analogicas:
http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CDEQFjAA&url=http%3A%2F%2Fplatea.pntic.mec.es%2F~mhidalgo%2Fdocumentos%2F04_2011_EntradasAnalogicas.pdf&ei=duguT6rcHNOBhQfts4WCCw&usg=AFQjCNH2BooTBKKIlgGrNE4GFWNj9cuFAw&sig2=3jowRw23996gFHStD4_nzw

Otra entrada interesante:
http://recursostic.educacion.es/observatorio/web/es/equipamiento-tecnologico/didactica-de-la-tecnologia/944-monografico-arduinoblocks?showall=1

Y otro..
http://www.arduinoacademy.com/

Notas: 
03/05/2012
Podeis ver un ejemplo más complejo en el siguiente enlace:
http://jsbsan.blogspot.com.es/2012/05/arduino-y-gambas3-lectura-y-graficos-de.html

19/05/2012
Podeis ver otro ejemplo (con dos ServoMotores) en este enlace:
http://jsbsan.blogspot.com.es/2012/05/gambas-y-arduino-moviendo-dos.html

27/01/2014: Solución Error: Cannot open serial port (5)


Tengo un arduino más moderno (tipo leonardo), y cuando ejecuto el programa me da el siguiente error Cannot open serial port(5). 
Esto es debido a  que tiene ya un verdadero puerto USB y ahora nombre del puerto de conexión se llama: /dev/ttyACM0 (en vez de /dev/ttyUSB0)

Con este cambio, en los datos del programa que hay que poner inicialmente,  ya se  ejecuta correctamente con este tipo de arduino:

Nota:
en el entorno del Ide de Arduino, cuando elegimos el tipo Leonardo, el puerto serie se denomina tambien  /dev/ttyACM0



Saludos