Inauguro una nueva categoría del blog: los snippets o fragmentos de código. En ella publicaré fragmentos de programas o subprogramas que por su corta extensión o por su generalidad de uso merece la pena disponer de ellos en forma de librería. También englobará pequeños ejemplos que publico en foros o manuales que sin duda será de utilidad.

El objetivo del fragmento de programa que nos ocupa es el de crear activar o desactivar el USB mediante la pulsación de una tecla concreta.
Para hacer eso debemos conocer el estado del USB, si está activado o desactivado y cuando es pulsado el botón. Para ello creamos una variable booleana (que solo recibe valores true o false) que si su valor es true indicará que está activado y si es false lo contrario. Puesto que al principio está desactivado la inicializaremos como false. Para ver si el botón arriba es pulsado debemos recibir la información de los controles mediante Controls.read() que almacenaremos en una variable (en realidad un array con la info de todos los botones) y además copiaremos la salida de los controles a cada ciclo o iteración del bucle principal para compararla con la del siguiente y así saber si la pulsación ha sido repetida. Mediante una instrucción condicional if veremos si ha sido pulsado el boton up (sin que sea una pulsación repetida), y en caso de haberlo sido, si el usb está activado. Si está activado lo desactivamos y si está desactivado lo activamos.

USB = false

while true do--bucle principal
pad = Controls.read()--leemos controles

if pad:up() and oldpad:up() ~ pad:up() then -- si ha sido pulsado el boton arriba y no lo ha sido en el ciclo anterior
   if USB (==true) then --Si USB es verdadero (true), es decir, esta activado
 -- fijate que USB ya es una expresión booleana por lo que no tendriamos porque comprobar mediante un codicional si es igual a true. por eso el parentesis en la condicion
        System.usbDiskModeDeactivate() --desactivamos
        USB = false
   else--sino
          System.usbDiskModeActivate() --activamos
          USB = true
   end
end

oldpad = pad --almacenamos controles de esta pasada para comprobar con la siguiente y evitar la pulsacion repetida

end--fin de bucle principal

Dado que esta tarea es bastante frecuente en su realización la decisión más optima sería crear un librería que nos permitiría reutilizar código y reducir la expresión de nuestro programa a un tamaño menor. Puesto que necesitamos una variable que almacene un valor que sólo será usado por esa función, englobaremos ambos elementos en una metatabla.

USB = {Estado = false}

function USB.Toggle()
pad = Controls.read()--leemos controles

if pad:up() and oldpad:up() ~ pad:up() then -- si ha sido pulsado el boton arriba y no lo ha sido en el ciclo anterior
   if Estado then --Si USB es verdadero (true), es decir, esta activado
 -- fijate que USB ya es una expresión booleana por lo que no tendriamos porque comprobar mediante un codicional si es igual a true. por eso el parentesis en la condicion
          System.usbDiskModeDeactivate() --desactivamos
          USB.Estado = false
   else--sino
          System.usbDiskModeActivate() --activamos
          USB.Estado = true
   end
end

oldpad = pad --almacenamos controles de esta pasada para comprobar con la siguiente y evitar la pulsacion repetida

end