Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 3
Ir a la página 1, 2, 3  Siguiente
 
Dispositivos USB En Listbox (SOLUCIONADO)
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Dispositivos USB En Listbox (SOLUCIONADO) 
 
Estoy intentado mostrar los dispositivos conectados al USB en un ListBox para poder seleccionarlos y al hacer eso que muestre su direccion fisica en una variable (/dev/sdx). He investigado un poco como lo hacen en otras aplicaciones y he encontrado este codigo en python, pero la verdad que no se como adaptarlo a gambas. He leido por hay que gambas es capaz de interpretar python... cosa que no se si es cierta..
def get_devices():
        for a in glob.glob("/sys/block/sd*"):
                removable = file(a+"/removable").read().startswith("1")
                mb_blocks = int(file(a+"/size").read()) / 2 / 1024
                name = " ".join([ file(a+b).read().strip() for b in ["/device/vendor","/device/model"] ])
                if removable and mb_blocks >= 1000:
                        a = a.replace("/sys/block","/dev")
                        yield (a,name,mb_blocks)


Vosotros que pensais? Habra alguna forma? Gracias...
 



 
última edición por Pablo-GNU el Lunes, 01 Febrero 2010, 20:33; editado 2 veces 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
Pablo, al menos las versiones actuales de gambas no interpretan código Python. No me parece viable a gambas traducir el código Python que muestras porque no funcionaría (usa bibliotecas de Python que también habría que traducir).

Ejecuta ese código en el intérprete Python para ver exactamente qué información suministra. Si te resulta útil podrías pensar en la forma de ejecutarlo desde gambas (llamando al intérprete Python, por supuesto).

También puedes usar los comandos:

lspci|grep USB

lsusb -t

lsusb


Filtrando un poco esos datos probablemente obtengas la información que necesitas. Aún si esa información no es suficiente me parece que la solución pasa por utilizar comandos/utilidades GNU/Linux para obtener datos o bien usar alguna biblioteca C/C++ que puedas utilizar desde gambas mediante "llamadas externas" (capítulo 9 del libro de gambas).

Saludos cordiales.
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
última edición por fabianfv el Miercoles, 27 Enero 2010, 15:23; editado 1 vez 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
No la verdad que los comandos del terminal no me son de mucha ayuda ya que, no son capaces de resolver esos dos parametros a la vez, lo que intento es traducir el codigo ese de Python a gambas, porque es Justamente lo que hay que hacer, pero mis conocimientos no son lo suficientemente amplios como para hacerlo...

La idea seria, hacer un listado de todos los directorios del /sys/block/ para obtener lo que van a ser los dispositivos de disco como tal... filtrando para que no muestre  todos los virtuales tales como ram* o loop* o sr. solo los que sean hd* o sd*... Eso creo con un rdir("/sys/block") podria conseguirlo, pero no estoy seguro y luego eso guardarlo en una variable string para con un for volcarlos a otra variable.

Despues habria que filtrar todas esos resultados, mirando que dentro de cada carpeta obtenida (sd*/) tiene que haber un fichero llamado "removable" y si dentro de ese fichero el valor es "1", puede mostrarse ya que es un dispositivo hotplug y no un disco duro nuestro, que en el caso de ser un disco duro nuestro, deberia de ser "0" y no mostrarse en la lista. Una vez filtrado los que se puedan mostrar, habria que leer el archivo que se encuentra dentro de la carpeta devices, que se llama vendor para guardar el fabricante y el archivo model para guardar el modelo y juntar la lectura de ambos en una sola linea, de esta manera ya tendrias que corresponde al, por ejemplo, KINGSTON (fabricante) DATA TRAVELER (modelo), y ademas como ya esta el sd*, a ese sd* le añadiriamos un /dev/ delante, por lo que ya tendriamos tambien la direccion fisica (Ejemplo: /dev/sdb) Y mostrar en el listbox por ejemplo KINGSTON DATA TRAVELER y que al pinchar esa opcion, una variable llamada fisica coja el valor que le corresponda, en ese caso, /dev/sdb/.

No pido que me lo hagais porque jamas se me ocurriria, soy nuevo en el foro y como habeis visto, todos mis posts he posteado la solucion despues de haber investigado. No me gusta que me den las cosas hechas, pero si que me hecheis una mano, os lo agradeceria de corazon.

Saludos.
 



 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
No puedes traducir ese código Python a gambas, no hay nada en gambas como:

Edito: perdón Pablo, está perfecto que quieras traducir ese código Python a gambas y es posible porque es bien sencillo (eso me pasa andar tan apurado y no leer el código, supuse que usaba alguna biblioteca de Python para obtener la lista de dispositivos USB).

Citar:

La idea seria, hacer un listado de todos los directorios del /sys/block/ para obtener lo que van a ser los dispositivos de disco como tal... filtrando para que no muestre  todos los virtuales tales como ram* o loop* o sr. solo los que sean hd* o sd*... Eso creo con un rdir("/sys/block") podria conseguirlo, pero no estoy seguro y luego eso guardarlo en una variable string para con un for volcarlos a otra variable.


Con RDIR o si no funciona tal vez sirva algo como:

DIM salida AS String
Dim arrSalida AS String[]

  'Usar alguna expresión regular que haga el filtro que deseas.
  SHELL "ls -l /sys/block|grep usb" TO salida
  arrsalida = split(salida, gb.newline)
 


Citar:

Despues habria que filtrar todas esos resultados, mirando que dentro de cada carpeta obtenida (sd*/) tiene que haber un fichero llamado "removable" y si dentro de ese fichero el valor es "1", puede mostrarse ya que es un dispositivo hotplug y no un disco duro nuestro, que en el caso de ser un disco duro nuestro, deberia de ser "0" y no mostrarse en la lista. Una vez filtrado los que se puedan mostrar, habria que leer el archivo que se encuentra dentro de la carpeta devices, que se llama vendor para guardar el fabricante y el archivo model para guardar el modelo y juntar la lectura de ambos en una sola linea, de esta manera ya tendrias que corresponde al, por ejemplo, KINGSTON (fabricante) DATA TRAVELER (modelo), y ademas como ya esta el sd*, a ese sd* le añadiriamos un /dev/ delante, por lo que ya tendriamos tambien la direccion fisica (Ejemplo: /dev/sdb) Y mostrar en el listbox por ejemplo KINGSTON DATA TRAVELER y que al pinchar esa opcion, una variable llamada fisica coja el valor que le corresponda, en ese caso, /dev/sdb/.


Lo que yo haría en primera instancia sería utilizar EXEC para ejecutar comandos Linux bien conocidos para hacer esto (cat, ls, etc), porque me parece que escribir código gambas sería más largo.

Citar:

No me gusta que me den las cosas hechas, pero si que me hecheis una mano, os lo agradeceria de corazon.


Ten la seguridad de que si no obtuviste respuestas más adecuadas es porque nadie más tuvo tiempo para responder o nadie más tuvo esta necesidad y por tanto tampoco el conocimiento sobre cómo hacerlo.

Saludos cordiales.
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
última edición por fabianfv el Jueves, 28 Enero 2010, 00:56; editado 3 veces 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
Hola
Quizá no entiendo bien, pero he hecho un pequeño código para sacar de lsusb lo que se quiere y pegarlo en un treeview. y no se que es lo que tiene esto de malo. Opcionalmente se podría mirar ese dispositivo a ver si es disco duro o impresora o que para ponerle el icono adecuado. Yo no me he preocupado de eso. Solo de sacar la información.

Te pego el código
PUBLIC SUB Form_Open()
me.arrangement=arrange.fill
Dim Arbol as new treeview(me)
DIM FTemp AS String, Var AS String

FTemp = Temp 'crear un nombre de archivo temporal
SHELL ("lsusb >" & fTemp) 'Llenar FTemp con la información requerida
LlenarArbol(fTemp) 'Llenar el arbol
KILL FTemp 'borrar el archivo temporal
END

PRIVATE SUB LlenarArbol(ftemp AS String)
  DIM F AS file, Linea AS String, Partes AS String[], Clave AS String, Dev AS String, Nombre AS String    
  arbol.Add("Bus 0", System.Host, Stock["16/home"]) 'poner el valor raíz
  
  f = OPEN (ftemp) FOR READ
  f.EndOfLine = gb.Unix
  
  DO WHILE NOT Eof(f)
    LINE INPUT #f, linea 'leer la línea entera
    partes = Split(linea, ":") 'dividirla en tres partes por el :
    clave = Left(partes[0], 7) 'la clave será algo como 'Bus 1'
    insertarbus(clave) 'insertar la el bus en el arbol con padre raíz
    Dev = Right(partes[0], 3) 'obtener el dev nº
    Nombre = Mid(partes[2], 5) 'obtener el nombre del dispositivo
    insertardev(dev, nombre, clave) 'insertar dispositivo en arbol
  LOOP
  END
  
  PRIVATE SUB insertarbus(Clave AS String)
  TRY arbol.Add(clave, Clave, Stock["16/connect"], "Bus 0")    
  FINALLY
  CATCH

  END
  
  PRIVATE SUB insertardev(dev AS String, nombre AS String, padre AS String)
  TRY arbol.Add(padre & "/" & dev, dev & ": " & nombre, Stock["16/attach"], padre)
  TRY arbol.item.EnsureVisible
  FINALLY
  CATCH
  END


Solo hay que pastearlo en un form y probar ¿qué tiene eso de malo? ¿Qué le falta?
 



 
última edición por soplo el Jueves, 28 Enero 2010, 05:07; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
Hola Fabian, muchas gracias por contestarme, ya se porque seguramente la gente no me contesto, pero queria aclarar eso, ya que soy de preguntar mucho las cosas para intentar optimizar al maximo el codigo, soy un buen creyente de que la programacion tiene que estar muy revisada para no tener errores ni dejar cabos sueltos, y como soy "nuevo" pues pregunto lo que no se y asi de paso de optimizar aprendo de la gente que sabe (autodidacta total), aclare eso para que no se me tome como un vago al que le gusta todo hecho. jejeje.

Con respecto al codigo, cre que es una buena opcion lo de tener en cuenta el usar codigo del terminal ya que sino.. podria ser un codigo muy exagerado en gambas el realizar esas tareas. Ire probando y te contare como va quedando.

Soplo, te contesto a ti tambien, estoy intentando probar tu codigo, te cuento lo malo del lsusb, el lsusb, lo malo que tiene, es que, no te muestra todos los datos como tal, y sacar la asociacion con el dispositivo fisico /dev, con los comandos que tiene, no se si es posible, casi todos los codigos que he leido en cuanto codigo, sacan la informacion del /sys/block, pero se puede probar con el lsusb.

Recibo 2 errores con tu codigo, el primero creo que lo he corregido y debe de ser por el orden de las lineas... tu has puesto esto:

PUBLIC SUB Form_Open()
me.arrangement=arrange.fill
Dim Arbol as new treeview(me)
DIM FTemp AS String, Var AS String

FTemp = Temp 'crear un nombre de archivo temporal
SHELL ("lsusb >" & fTemp) 'Llenar FTemp con la información requerida
LlenarArbol(fTemp) 'Llenar el arbol
KILL FTemp 'borrar el archivo temporal
END


Y recibo unexpected DIM

Lo he cambiado por esto:

PUBLIC SUB Form_Open()
DIM FTemp AS String, Var AS String
DIM arbol AS NEW treeview(ME)
ME.arrangement = arrange.fill
FTemp = Temp 'crear un nombre de archivo temporal
SHELL ("lsusb >" & fTemp) 'Llenar FTemp con la información requerida
LlenarArbol(fTemp) 'Llenar el arbol
KILL FTemp 'borrar el archivo temporal
END
 


Y ya dejo de recibirlo, simplemente como ves, ha sido mover los dos DIM encima del  ME.arragement.

Pero ahora recibo otro error que es el Unknow Identifier Arbol

PRIVATE SUB LlenarArbol(ftemp AS String)
 DIM F AS file, Linea AS String, Partes AS String[], Clave AS String, Dev AS String, Nombre AS String    
 arbol.Add("Bus 0", System.Host, Stock["16/home"]) 'poner el valor raíz
 
 f = OPEN (ftemp) FOR READ
 f.EndOfLine = gb.Unix
 
 DO WHILE NOT Eof(f)
   LINE INPUT #f, linea 'leer la línea entera
   partes = Split(linea, ":") 'dividirla en tres partes por el :
   clave = Left(partes[0], 7) 'la clave será algo como 'Bus 1'
   insertarbus(clave) 'insertar la el bus en el arbol con padre raíz
   Dev = Right(partes[0], 3) 'obtener el dev nº
   Nombre = Mid(partes[2], 5) 'obtener el nombre del dispositivo
   insertardev(dev, nombre, clave) 'insertar dispositivo en arbol
 LOOP
 END
 
 PRIVATE SUB insertarbus(Clave AS String)
 TRY arbol.Add(clave, Clave, Stock["16/connect"], "Bus 0")    
 FINALLY
 CATCH

 END
 
 PRIVATE SUB insertardev(dev AS String, nombre AS String, padre AS String)
 TRY arbol.Add(padre & "/" & dev, dev & ": " & nombre, Stock["16/attach"], padre)
 TRY arbol.item.EnsureVisible
 FINALLY
 CATCH
 END


He mirado si era cosa de que Arbol arriba lo declaras con  mayusculas en lugar de minusculas la primera letra, pero aunque lo ponga de ambas maneras no funciona de misma manera, tambien he probado a escribir la linea a mano para ver si lo reconoce y empieza a autocompletar, y al escribir "ar..." lo rellena pero al poner el "." las opciones no se despliegan, pero segun creo esto puede deberse a que el objeto no este creado con modo grafico sino a  mano en el codigo. o me equivoco? Bueno voy a ver como puedo probarlo. Saludos y muchisimas gracias por contestarme.

P.D.: Que dificil es escribir o seleccionar codigo en el 4X4 del trabajo mientras vas de copiloto y tu compañero sube a la montaña conduciendo por caminos de tierra y piedra.. xD
 



 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
Creo que es porque Arbol está definido en Main y no se le ha pasado a LlenarArbol. No puedo probar ahora (de hecho no debería haberlo mirado siquiera je je) pero prueba a cambiar esto en Main:

PUBLIC SUB Form_Open()
Dim Arbol as new treeview(me)
DIM FTemp AS String, Var AS String
me.arrangement=arrange.fill

FTemp = Temp 'crear un nombre de archivo temporal
SHELL ("lsusb >" & fTemp) 'Llenar FTemp con la información requerida
LlenarArbol(fTemp,Arbol) 'Llenar el arbol
KILL FTemp 'borrar el archivo temporal
END


Y luego la rutina LlenarArbol
PRIVATE SUB LlenarArbol(ftemp AS String, Arbol as treeview)
 DIM F AS file, Linea AS String, Partes AS String[], Clave AS String, Dev AS String, Nombre AS String    
 arbol.Add("Bus 0", System.Host, Stock["16/home"]) 'poner el valor raíz
 
 f = OPEN (ftemp) FOR READ
 f.EndOfLine = gb.Unix
 
 DO WHILE NOT Eof(f)
   LINE INPUT #f, linea 'leer la línea entera
   partes = Split(linea, ":") 'dividirla en tres partes por el :
   clave = Left(partes[0], 7) 'la clave será algo como 'Bus 1'
   insertarbus(clave,Arbol) 'insertar la el bus en el arbol con padre raíz
   Dev = Right(partes[0], 3) 'obtener el dev nº
   Nombre = Mid(partes[2], 5) 'obtener el nombre del dispositivo
   insertardev(dev, nombre, clave,Arbol) 'insertar dispositivo en arbol
 LOOP
 END
 
 PRIVATE SUB insertarbus(Clave AS String, Arbol as treeview)
 TRY arbol.Add(clave, Clave, Stock["16/connect"], "Bus 0")    
 FINALLY
 CATCH

 END
 
 PRIVATE SUB insertardev(dev AS String, nombre AS String, padre AS String, Arbol as treeview)
 TRY arbol.Add(padre & "/" & dev, dev & ": " & nombre, Stock["16/attach"], padre)
 TRY arbol.item.EnsureVisible
 FINALLY
 CATCH
 END

Es decir, para hacerlo mas legible hice que el treeview se creara solo y entonces hay que pasarlo a las respectivas funciones. Nada mas.

Y seguramente te valdrá. En cualquier caso te vale como ejemplo. Yo he volcado lsusb a un archivo temporal y luego he ido leyendo línea a línea lo que me ha interesado y colocándolo en un treeview. De igual manera puedes hacer un udevinfo o algo así y volcar lo que te convenga. Luego lo revisas línea a línea y te quedas con lo que te convenga.

Un saludo
 



 
última edición por soplo el Jueves, 28 Enero 2010, 17:46; editado 3 veces 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
Un par de aspectos a considerar:

Si se usan comandos externos hay que asegurarse que estén presentes en el sistema y para ello, añadir las dependencias "extra" necesarias al paquete de instalación del proyecto es, probablemente, la mejor opción.

Cuando se consulta información de directorios hay que asegurarse que otras distribuciones usan el mismo directorio o añadir las variantes al proyecto. Por ello, generalmente es mejor usar comandos o una biblioteca.

Saludos cordiales.
 




===================
Cómo programar con Gambas

Speed Books: informática libre.
 
fabianfv - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
Soplo, he probado tu codigo y ahora no recibo ningun error, pero tampoco observo nada, solo muestra lo que es mi carpeta home...

FabianFV, creo que habra que hacerlo con codigo gambas, pero estoy dudoso de los medios, porque por ejemplo, he conseguido hacer con rdir, el listado de los dispositivos que me interesan, pero solo filtrandole el sd, y he probado otro metodo que procedo a explicarte, a ti tambien soplo! jejej.

Yo lo primero que iba a hacer es filtrar todo lo que hay dentro de /sys/block, y aplicar un filtro para que me guarde todas las carpetas menos las loop y las ram, ya que son virtuales y no me sirven, y del resultado de eso, tendria que mirar dentro de las carpetas para poder seleccionar las que me quedo segun el contenido que tenga dentro el fichero "removable" ubicado dentro de las carpetas, EJ: si me quedo sda, sdb y sdc, tendre que mirar el fichero que removable dentro de cada carpeta para poder saber si es hotplug, osea que si el removable dentro de sda y este tiene valor "0" tendre que descartarlo del resultado por ser un disco duro como tal, y si miro dentro de sdb y removable tiene valor "1", debo quedarmelo por se extraible al igual que si lo tuviese sdc. Bueno a donde quiero llegar con esto.. pues facil, los virtuales tambien tienen archivo removable y ese fichero contiene valor "0", por lo tanto no deberia hacer todo lo anterior, deberia hacer solamente el filtro de removable y asi de esa manera guardarlo, asi ya tendria dos filtros hechos...

Bien, el tema es el siguiente... si yo hago lo siguiente:

FOR EACH directorio IN Dir("/sys/block", "[^.]*", gb.Directory)
 
obtendria toda la cadena de directorios? o me equivoco? Pero como puedo hacer la continuacion para que mire el fichero removable dentro de cada uno y guardar el nombre del primer directorio (sdx o hdx) dentro de una variable?

Si resolvemos esto, espero que le sirva a mucha gente, porque a mi ya se me ha convertido en un reto personal, por cierto ya tengo el libro de gambas que me acaba de llegar asique en breves ire escaneando a una muy buena calidad y lo subire. Gracias a todos!
 



 
última edición por Pablo-GNU el Jueves, 28 Enero 2010, 23:21; editado 1 vez 
Pablo-GNU - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Dispositivos USB En Listbox 
 
Citar:
Soplo, he probado tu codigo y ahora no recibo ningun error, pero tampoco observo nada, solo muestra lo que es mi carpeta home...

No se porque al ver esto lo he probado yo también y a veces si sale y a veces no sale. Creo que es por el tiempo. Quizá no le ha dado tiempo a crear el archivo cuando llega la siguiente instrucción y por tanto el archivo está vacío y no hay nada que leer.

Digo yo que será por eso porque otra algunas veces que lo he ejecutado ha salido y otras no. Probablemente le falta un wait a la orden shell.

porque salir si sale

De hecho saca alguna información de lsusb, pero podría sacar mucho mas porque interrogando a udev con el vendor y el idproduct se puede sacar lo que se quiera.
 



 
última edición por soplo el Viernes, 29 Enero 2010, 01:43; editado 1 vez 
soplo - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Listbox camilo02 Controles/Librerías/Componentes 5 Viernes, 13 Abril 2012, 02:40 Ver último mensaje
camilo02
No hay nuevos mensajes Ayuda Con Listbox soldadozero Controles/Librerías/Componentes 12 Sabado, 15 Junio 2013, 18:24 Ver último mensaje
jguardon
No hay nuevos mensajes Conocer Con Las Funciones Externas De ALSA... vuott Aplicaciones/Fragmentos de Código 2 Sabado, 31 May 2014, 01:45 Ver último mensaje
vuott
No hay nuevos mensajes Conseguir Informaciones Generales De Los D... vuott Aplicaciones/Fragmentos de Código 6 Viernes, 21 Septiembre 2018, 13:40 Ver último mensaje
vuott
 

Publicar nuevo tema  Responder al tema  Página 1 de 3
Ir a la página 1, 2, 3  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron