Paso 6: endosador: ¿Qué es el código?
El firmware de nuestro dispositivo se inicia con una definición de clase para la clase de "impresora". Las clases son un poco más útiles en situaciones donde desea crear varias instancias de algo, pero esto proporcionar una buena manera de estructurar nuestro código. La mayoría de las cosas que el firmware del dispositivo tiene que hacer aquí se crea como métodos de la clase de impresora. La impresora también realiza un seguimiento de su propia configuración actual.
En el interior de constructor de la clase impresora, vemos una línea cool para configurar el hardware UART (Universal Asynchronous recibir y transmitir) en el imp:
hardware.uart57.configure(19200, 8, PARITY_NONE, 1, NO_CTSRTS);
Esto configura el hardware UART en las patillas 5 y 7, configura la velocidad a 19200 (bits por segundo), 8 bits de datos por palabra, ningún bit de paridad, bit de parada y sin control de flujo; sólo de la más simple UART configuración que puede utilizar.
A continuación la definición de clase para la impresora, el dispositivo registra algunas devoluciones de llamada para el agente. Podemos pensar en éstos como ganchos, cada uno dando al agente una manera de decir el dispositivo para hacer algo. Las devoluciones de llamada agente registrados en "agent.on()", que toma dos argumentos: una cadena, que pasará por el agente al dispositivo que devolución de llamada a utilizar; y una función, que será llamada cuando el agente envía la cadena:
agent.on("print", function(buffer) {<br> server.log("Device: printing new buffer from agent: "+buffer);<br> myPrinter.print(buffer);<br>});
Busca en el firmware, vemos que hemos registrado las devoluciones de llamada para todo tipo de cosas; alternar texto negrita o subrayado, diciendo el imp para comenzar a descargar una imagen del agente mediante la devolución de llamada de "pull" (que encontrará como un método de la clase de impresora), la alimentación de un determinado número de líneas, etc..
Cuando las devoluciones de llamada de agente son todos registrados y se definen las clases, crear una instancia de la clase de impresora para crear un objeto de impresora, y estamos listos para ir. El firmware del dispositivo es principalmente impulsada por eventos; pedacitos de ella son llamados a la acción cuando el agente señala que es tiempo de hacer algo.
// instantiate the printer object at global scope myPrinter <- printer(hardware.uart57, 19200);<br>
El firmware del agente es lo mismo, pero incluso más corto, con algunas interesantes pedacitos para interacciones HTTP. Echemos un vistazo:
Poner todo en marcha con una definición de la función printLogo - vamos a ver que esta registrado como una devolución de llamada para el evento de "logo" un poco más abajo. Uno muy útil poco aquí está la ilustración de cómo hacer una solicitud HTTP GET de su agente:
local reqURL = "http://electricimp.com/docs/attachments/images/examples/resources/ei_logo_tinyprinter.bmp";<br>local req = http.get(reqURL);<br>imageData = req.sendsync().body;
Hacemos un objeto de la petición con "http.get(reqURL), luego enviarlo, que devuelve un objeto de respuesta http. El cuerpo de ese objeto de respuesta contiene los datos de imagen - es tan simple como eso!
Después de hacer un poco de trabajo con los datos de la imagen, vemos al agente envía un evento al dispositivo. Aquí, tenemos que enviar varios parámetros para el dispositivo, así que empacar en una matriz y luego enviar esa matriz con el evento:
local imageParams = [imageSize, imageWidth, imageHeight]; device.send("downloadImage", imageParams);
Más abajo, vemos las devoluciones de llamada registrada para los eventos "tire" y "imageDone" desde el dispositivo, luego una devolución de llamada registrada con "http.onrequest". Esto es muy útil agente API: la función aquí registrada será llamada cada vez que se hace una petición HTTP (de cualquier método) a la URL de agente en configuración del dispositivo. Se trata de cómo el agente maneja nuevos datos desde la Web de la versión parcial de programa de impresora:
http.onrequest(function(request,res){
Una muy importante parte aquí, para enviar mensajes al agente: cuando tu navegador envía un mensaje, envía una comprobación Compruebe primero qué métodos soporta receptor. El receptor proporciona esta información con sus cabeceras de respuesta. Si éstos no demuestran que el agente soporta POST, la página no hay que enviar el mensaje, y la petición al agente será vacía! Aquí es donde nos estas cabeceras para permitir nuestra página trabajar:
res.header("Access-Control-Allow-Origin", "*");<br>res.header("Access-Control-Allow-Headers","Origin, X-Requested-With, Content-Type, Accept"); res.header("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
El agente hace otra cosa útil después de ajustan los encabezados, pero antes de enviar una respuesta: determina si se utiliza el texto imagen o mensaje de controlador de mensajes basado en la ruta de la URL a la que realizó la solicitud:
if (request.path == "/text") {
Último en el código de agente, vemos la devolución de llamada registrado para el evento de "logo" del dispositivo:
device.on("logo", function(value) {<br> printLogo();<br>});
Eso es todo el encuentro de Disparos! La impresora todo conectado a internet, en menos de 600 líneas.