commit 5f2b731367977add061acd00e36b48759942be57 Author: Dooho Yi Date: Tue May 30 01:58:02 2023 +0900 init diff --git a/cfirmata_esp.ino b/cfirmata_esp.ino new file mode 100644 index 0000000..02d2342 --- /dev/null +++ b/cfirmata_esp.ino @@ -0,0 +1,203 @@ +// +// configurablefirmata_esp8266 +// +// D. Yi @ 2023 5 23 +// + +#define WIRELESS + +#if defined(WIRELESS) +//wi-fi +#include + +//network! +const char* ssid = "esp1"; +const char* password = "1111100000"; +const int NETWORK_PORT = 27016; +// IPAddress local_IP(192, 168, 137, 111); +// IPAddress gateway(192, 168, 137, 1); +// IPAddress subnet(255, 255, 255, 0); + +//wi-fi event handlers : re-connect automatically +WiFiEventHandler wifiConnectHandler; +WiFiEventHandler wifiDisconnectHandler; +void onWifiConnect(const WiFiEventStationModeGotIP& event) { + Serial.println("Connected to Wi-Fi sucessfully."); + Serial.print("IP address: "); + Serial.println("Mac address: " + WiFi.macAddress()); + Serial.println(WiFi.localIP()); + digitalWrite(2, HIGH); +} + +void onWifiDisconnect(const WiFiEventStationModeDisconnected& event) { + Serial.println("Disconnected from Wi-Fi, trying to reconnect..."); + WiFi.disconnect(); + WiFi.begin(ssid, password); + digitalWrite(2, LOW); +} +#endif + +//firmata over wi-fi +#include +#if defined(WIRELESS) +#include "utility/WiFiClientStream.h" +#include "utility/WiFiServerStream.h" +WiFiServerStream serverStream(NETWORK_PORT); + +//firmware update over the air +#include +#endif + +//handle digitalWrite +byte previousPORT[TOTAL_PORTS]; +void digitalWriteCallback(byte port, int value) +{ + byte i; + byte currentPinValue, previousPinValue; + + if (port < TOTAL_PORTS && value != previousPORT[port]) { + for (i = 0; i < 8; i++) { + currentPinValue = (byte) value & (1 << i); + previousPinValue = previousPORT[port] & (1 << i); + if (currentPinValue != previousPinValue) { + digitalWrite(i + (port * 8), currentPinValue); + } + } + previousPORT[port] = value; + } +} + +//// +void setup() +{ + //pinmodes + //digital inputs + pinMode(D1, INPUT_PULLUP); + pinMode(D2, INPUT_PULLUP); + pinMode(D3, INPUT_PULLUP); + pinMode(D5, INPUT_PULLUP); + pinMode(D6, INPUT_PULLUP); + pinMode(D7, INPUT_PULLUP); + + //digital outputs + pinMode(D4, OUTPUT); //build-in LED && also used as wifi indicator! +#if defined(WIRELESS) + digitalWrite(D4, LOW); //LOW ==> LED ON ==> 'wifi. disconnected.' +#else + digitalWrite(D4, HIGH); //HIGH ==> LED OFF +#endif + + //serial (for debug & info) + Serial.begin(57600); + +#if defined(WIRELESS) + //wifi + wifiConnectHandler = WiFi.onStationModeGotIP(onWifiConnect); + wifiDisconnectHandler = WiFi.onStationModeDisconnected(onWifiDisconnect); + WiFi.mode(WIFI_STA); + //Connect to WiFi network + Serial.println(); + Serial.println(); + Serial.print("Connecting to "); + Serial.println(ssid); + // if (!WiFi.config(local_IP, gateway, subnet)) { + // Serial.println("STA Failed to configure"); + // } + WiFi.begin(ssid, password); + while (WiFi.status() != WL_CONNECTED) { + // Serial.print("."); + delay(500); + } + Serial.println(""); +#endif + + //firmata + Firmata.disableBlinkVersion(); + Firmata.attach(DIGITAL_MESSAGE, digitalWriteCallback); +#if defined(WIRELESS) + Firmata.begin(serverStream); +#else + Firmata.begin(Serial); +#endif + +#if defined(WIRELESS) + //ota + ArduinoOTA.onStart([]() { + Serial.println("Start"); + }); + ArduinoOTA.onEnd([]() { + Serial.println("\nEnd"); + }); + ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { + Serial.printf("Progress: %u%%\r", (progress / (total / 100))); + }); + ArduinoOTA.onError([](ota_error_t error) { + Serial.printf("Error[%u]: ", error); + if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); + else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); + else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); + else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); + else if (error == OTA_END_ERROR) Serial.println("End Failed"); + }); + ArduinoOTA.begin(); +#endif +} + +void loop() +{ + // loop frequency = 50hz (20 ms) + static unsigned long last = 0; + unsigned long now = millis(); + if (now > last + 20) { + last = now; + + // + static int counter = 0; + counter++; + if (counter == 1000) counter = 0; + + //digital + //==> https://randomnerdtutorials.com/esp8266-pinout-reference-gpios/ + byte port = 0; + + static byte port0_prev = 0; + port = 0x00; + port |= (0 ? 0x01 : 0x00); // EXCLUDED ==> no interrupt.. let's just leave it. + port |= (digitalRead(D1) ? 0x02 : 0x00); + port |= (digitalRead(D2) ? 0x04 : 0x00); + port |= (digitalRead(D3) ? 0x08 : 0x00); // by design, PULLED-UP, being used for the FLASH button. + port |= (0 ? 0x10 : 0x00); // EXCLUDED ==> LED output + port |= (digitalRead(D5) ? 0x20 : 0x00); + port |= (digitalRead(D6) ? 0x40 : 0x00); + port |= (digitalRead(D7) ? 0x80 : 0x00); + if (port0_prev != port) Firmata.sendDigitalPort(0, port); + port0_prev = port; + + //analog 0 + Firmata.sendAnalog(0, analogRead(0)); + + //send out alive counter every 1sec. (50 counts x 20ms == 1 sec.) + if (counter % 50 == 0) { + static int alivecounter = 0; + Firmata.sendAnalog(1, alivecounter); + alivecounter++; + if (alivecounter == 1000) alivecounter = 0; + } + } + + //process firmata stream + while (Firmata.available()) { + Firmata.processInput(); + } + +#if defined(WIRELESS) + //firmata over wi-fi + serverStream.maintain(); + + // + ArduinoOTA.handle(); +#endif + + //for wdt + yield(); +} diff --git a/pd/arduino-serial-test.pd b/pd/arduino-serial-test.pd new file mode 100644 index 0000000..4b710d5 --- /dev/null +++ b/pd/arduino-serial-test.pd @@ -0,0 +1,92 @@ +#N canvas 492 30 602 584 12; +#X obj 25 349 route digital analog; +#X obj 25 63 tgl 20 0 empty empty LED\ ON/OFF 0 -10 0 12 #7c7c7c #ffffff #000000 0 1; +#X msg 25 137 digital 2 \$1; +#X obj 356 389 vsl 20 170 0 1 0 0 empty empty analog0 10 -9 0 12 #e3c6ff #000000 #000000 0 1; +#X floatatom 356 338 5 0 0 0 - - - 0; +#X obj 356 313 route 0; +#X obj 25 88 == 0; +#X floatatom 25 113 5 0 0 0 - - - 0; +#X text 97 112 D4 == GPIO2; +#X obj 25 470 route 1 2 3 5 6 7, f 25; +#X obj 25 508 tgl 20 0 empty empty D1 0 30 0 12 #ffc7c6 #000000 #000000 0 1; +#X obj 53 508 tgl 20 0 empty empty D2 0 30 0 12 #ffe3c6 #000000 #000000 0 1; +#X obj 82 508 tgl 20 0 empty empty D3 0 30 0 12 #feffc6 #000000 #000000 0 1; +#X obj 111 508 tgl 20 0 empty empty D5 0 30 0 12 #c6ffc7 #000000 #000000 0 1; +#X obj 139 508 tgl 20 0 empty empty D6 0 30 0 12 #c6feff #000000 #000000 0 1; +#X obj 168 508 tgl 20 0 empty empty D7 0 30 0 12 #c7c6ff #000000 #000000 0 1; +#X text 74 15 ==== digital OUTPUT ===; +#X text 74 415 ==== digital INPUT ===; +#X text 305 287 ==== analog INPUT ===; +#N canvas 836 419 450 201 scope 0; +#N canvas 0 50 450 250 (subpatch) 0; +#X array scope 200 float 0; +#X coords 0 1.5 200 -0.5 200 140 1 0 0; +#X restore 26 29 graph; +#X obj 367 76 f; +#X obj 403 76 + 1; +#X obj 272 56 t a b; +#X floatatom 367 126 5 0 0 0 - - - 0; +#X obj 272 150 tabwrite scope; +#X obj 367 101 mod 200; +#X obj 272 31 inlet; +#X connect 1 0 2 0; +#X connect 1 0 6 0; +#X connect 2 0 1 1; +#X connect 3 0 5 0; +#X connect 3 1 1 0; +#X connect 4 0 5 1; +#X connect 6 0 4 0; +#X connect 7 0 3 0; +#X restore 435 439 pd scope; +#N canvas 0 0 361 269 net 0; +#X obj 28 88 route 1; +#X floatatom 28 138 5 0 0 0 - - - 0; +#X obj 28 113 * 1023; +#X obj 28 162 bng 20 250 50 0 empty empty live! 0 30 0 12 #fcfcfc #000000 #000000; +#X text 84 20 ==== network STATUS ===; +#X obj 28 58 inlet; +#X obj 101 138 del; +#X msg 101 113 stop \, 2000; +#X obj 28 217 outlet; +#X obj 101 217 outlet; +#X connect 0 0 2 0; +#X connect 1 0 3 0; +#X connect 2 0 1 0; +#X connect 3 0 7 0; +#X connect 3 0 8 0; +#X connect 5 0 0 0; +#X connect 6 0 9 0; +#X connect 7 0 6 0; +#X restore 381 190 pd net; +#X obj 381 215 bng 20 250 50 0 empty empty (online) 0 30 0 12 #fcfcfc #000000 #000000; +#X text 380 169 connection monitoring; +#X obj 460 215 bng 20 250 50 0 empty empty disconnected! 0 30 0 12 #fcfcfc #000000 #000000; +#X obj 510 206 print X!; +#X obj 25 238 arduino; +#X msg 48 196 devices; +#X msg 38 172 devicename COM4; +#X msg 124 202 close; +#X connect 0 0 9 0; +#X connect 0 1 5 0; +#X connect 0 1 20 0; +#X connect 1 0 6 0; +#X connect 2 0 25 0; +#X connect 3 0 19 0; +#X connect 4 0 3 0; +#X connect 5 0 4 0; +#X connect 6 0 7 0; +#X connect 7 0 2 0; +#X connect 9 0 10 0; +#X connect 9 1 11 0; +#X connect 9 2 12 0; +#X connect 9 3 13 0; +#X connect 9 4 14 0; +#X connect 9 5 15 0; +#X connect 20 0 21 0; +#X connect 20 1 23 0; +#X connect 23 0 24 0; +#X connect 25 0 0 0; +#X connect 26 0 25 0; +#X connect 27 0 25 0; +#X connect 28 0 25 0; diff --git a/pd/arduino-wifi-test.pd b/pd/arduino-wifi-test.pd new file mode 100644 index 0000000..3c7e039 --- /dev/null +++ b/pd/arduino-wifi-test.pd @@ -0,0 +1,150 @@ +#N canvas 221 33 602 588 12; +#X msg 154 238 disconnect; +#X obj 381 39 bng 20 250 50 0 empty empty search\ &&\ connect 0 -10 0 12 #fcfcfc #000000 #000000; +#N canvas 0 0 489 532 arduino 0; +#X obj 19 77 zconf.browse; +#X obj 19 290 zconf.resolve; +#X msg 19 249 resolve _arduino._tcp. esp8266-0b5620 local.; +#X obj 19 315 route resolve; +#X obj 59 371 list split 1; +#X obj 19 346 list split 5; +#X obj 59 412 separate .; +#X obj 59 437 t b a; +#X msg 91 462 set connect \$1.\$2.\$3.\$4 27016; +#X obj 59 493 outlet; +#X text 134 489 connect msg. builder with IP & port number; +#X obj 203 159 unpack f f f f, f 18; +#X floatatom 203 119 5 0 0 0 - - - 0; +#X floatatom 244 119 5 0 0 0 - - - 0; +#X floatatom 285 119 5 0 0 0 - - - 0; +#X floatatom 326 119 5 0 0 1 IP - - 0; +#X listbox 203 97 20 0 0 1 ident - - 0; +#X obj 19 112 route add; +#X obj 19 137 list; +#X msg 51 224 set resolve \$2 \$1 \$3; +#X obj 19 199 t b a; +#X msg 19 52 type \, type _arduino._tcp; +#X msg 139 108 set \$1; +#X obj 19 18 inlet; +#X text 171 372 depends on: external: zconf \, else; +#X text 171 324 mDNS discovery (a.k.a. zeroconf \, bonjour); +#X connect 0 0 17 0; +#X connect 1 0 3 0; +#X connect 2 0 1 0; +#X connect 3 0 5 0; +#X connect 4 0 6 0; +#X connect 5 1 4 0; +#X connect 6 0 7 0; +#X connect 6 0 11 0; +#X connect 7 0 9 0; +#X connect 7 1 8 0; +#X connect 8 0 9 0; +#X connect 11 0 12 0; +#X connect 11 1 13 0; +#X connect 11 2 14 0; +#X connect 11 3 15 0; +#X connect 17 0 18 0; +#X connect 18 0 22 0; +#X connect 18 0 20 0; +#X connect 19 0 2 0; +#X connect 20 0 2 0; +#X connect 20 1 19 0; +#X connect 21 0 0 0; +#X connect 22 0 16 0; +#X connect 23 0 21 0; +#X coords 0 -1 1 1 185 80 1 200 60; +#X restore 381 64 pd arduino mDNS discovery; +#X obj 25 258 arduino-wifi; +#X obj 106 283 tgl 20 0 empty empty connected? 23 10 0 12 #bbbbbb #000000 #000000 0 1; +#X obj 106 308 bng 20 250 50 0 empty empty empty 0 -10 0 12 #fcfcfc #000000 #000000; +#X obj 25 349 route digital analog; +#X obj 25 63 tgl 20 0 empty empty LED\ ON/OFF 0 -10 0 12 #7c7c7c #ffffff #000000 0 1; +#X msg 25 137 digital 2 \$1; +#X obj 356 389 vsl 20 170 0 1 0 0 empty empty analog0 10 -9 0 12 #e3c6ff #000000 #000000 0 1; +#X floatatom 356 338 5 0 0 0 - - - 0; +#X obj 356 313 route 0; +#X obj 25 88 == 0; +#X floatatom 25 113 5 0 0 0 - - - 0; +#X text 97 112 D4 == GPIO2; +#X obj 25 470 route 1 2 3 5 6 7, f 25; +#X obj 25 508 tgl 20 0 empty empty D1 0 30 0 12 #ffc7c6 #000000 #000000 0 1; +#X obj 53 508 tgl 20 0 empty empty D2 0 30 0 12 #ffe3c6 #000000 #000000 0 1; +#X obj 82 508 tgl 20 0 empty empty D3 0 30 0 12 #feffc6 #000000 #000000 0 1; +#X obj 111 508 tgl 20 0 empty empty D5 0 30 0 12 #c6ffc7 #000000 #000000 0 1; +#X obj 139 508 tgl 20 0 empty empty D6 0 30 0 12 #c6feff #000000 #000000 0 1; +#X obj 168 508 tgl 20 0 empty empty D7 0 30 0 12 #c7c6ff #000000 #000000 0 1; +#X text 74 15 ==== digital OUTPUT ===; +#X text 74 415 ==== digital INPUT ===; +#X text 305 287 ==== analog INPUT ===; +#N canvas 836 419 450 201 scope 1; +#N canvas 0 50 450 250 (subpatch) 0; +#X array scope 200 float 0; +#X coords 0 1.5 200 -0.5 200 140 1 0 0; +#X restore 26 29 graph; +#X obj 367 76 f; +#X obj 403 76 + 1; +#X obj 272 56 t a b; +#X floatatom 367 126 5 0 0 0 - - - 0; +#X obj 272 150 tabwrite scope; +#X obj 367 101 mod 200; +#X obj 272 31 inlet; +#X connect 1 0 2 0; +#X connect 1 0 6 0; +#X connect 2 0 1 1; +#X connect 3 0 5 0; +#X connect 3 1 1 0; +#X connect 4 0 5 1; +#X connect 6 0 4 0; +#X connect 7 0 3 0; +#X restore 435 439 pd scope; +#N canvas 0 0 361 269 net 0; +#X obj 28 88 route 1; +#X floatatom 28 138 5 0 0 0 - - - 0; +#X obj 28 113 * 1023; +#X obj 28 162 bng 20 250 50 0 empty empty live! 0 30 0 12 #fcfcfc #000000 #000000; +#X text 84 20 ==== network STATUS ===; +#X obj 28 58 inlet; +#X obj 101 138 del; +#X msg 101 113 stop \, 2000; +#X obj 28 217 outlet; +#X obj 101 217 outlet; +#X connect 0 0 2 0; +#X connect 1 0 3 0; +#X connect 2 0 1 0; +#X connect 3 0 7 0; +#X connect 3 0 8 0; +#X connect 5 0 0 0; +#X connect 6 0 9 0; +#X connect 7 0 6 0; +#X restore 381 190 pd net; +#X obj 381 215 bng 20 250 50 0 empty empty (online) 0 30 0 12 #fcfcfc #000000 #000000; +#X text 380 169 connection monitoring; +#X obj 460 215 bng 20 250 50 0 empty empty disconnected! 0 30 0 12 #fcfcfc #000000 #000000; +#X obj 510 206 print X!; +#X msg 106 193 connect 192.168.137.113 27016; +#X connect 0 0 3 1; +#X connect 1 0 2 0; +#X connect 2 0 31 0; +#X connect 3 0 6 0; +#X connect 3 1 4 0; +#X connect 4 0 5 0; +#X connect 6 0 15 0; +#X connect 6 1 11 0; +#X connect 6 1 26 0; +#X connect 7 0 12 0; +#X connect 8 0 3 0; +#X connect 9 0 25 0; +#X connect 10 0 9 0; +#X connect 11 0 10 0; +#X connect 12 0 13 0; +#X connect 13 0 8 0; +#X connect 15 0 16 0; +#X connect 15 1 17 0; +#X connect 15 2 18 0; +#X connect 15 3 19 0; +#X connect 15 4 20 0; +#X connect 15 5 21 0; +#X connect 26 0 27 0; +#X connect 26 1 29 0; +#X connect 29 0 30 0; +#X connect 31 0 3 1; diff --git a/pd/arduino-wifi.pd b/pd/arduino-wifi.pd new file mode 100644 index 0000000..bcabb92 --- /dev/null +++ b/pd/arduino-wifi.pd @@ -0,0 +1,1182 @@ +#N canvas 350 188 596 398 10; +#X obj 32 56 inlet; +#X obj 32 334 outlet; +#N canvas 214 231 982 332 command 0; +#X obj 24 7 inlet; +#X obj 299 298 outlet; +#N canvas 562 295 547 478 digital-out 0; +#X obj 4 15 inlet; +#X obj 284 440 outlet; +#X msg 373 158 \$1; +#X text 402 157 add channel to command; +#X text 411 201 0x90; +#X obj 373 202 + 144; +#X obj 373 180 div 8; +#X obj 212 391 float; +#X obj 145 391 float; +#X obj 459 16 inlet; +#X text 339 15 state from port-out; +#X msg 157 84 \$2; +#X obj 237 121 <<; +#X msg 237 100 1 \$1; +#X obj 284 242 * 8; +#X obj 172 371 >> 7; +#X obj 239 371 & 127; +#X obj 249 314 &; +#X msg 290 267 255 \$1; +#X obj 290 288 <<; +#X obj 5 55 trigger bang bang bang anything anything anything; +#X obj 157 267 float; +#X obj 255 338 >>; +#X obj 207 197 |; +#X obj 207 165 float; +#X obj 157 159 float; +#X obj 157 115 select 0 1; +#X floatatom 462 49 0 0 0 0 - - - 0; +#X obj 157 181 * -1; +#X obj 157 210 - 1; +#X obj 157 239 &; +#X connect 0 0 20 0; +#X connect 2 0 6 0; +#X connect 5 0 1 0; +#X connect 6 0 5 0; +#X connect 6 0 14 0; +#X connect 7 0 1 0; +#X connect 8 0 1 0; +#X connect 9 0 23 0; +#X connect 9 0 27 0; +#X connect 11 0 26 0; +#X connect 12 0 24 1; +#X connect 12 0 25 1; +#X connect 13 0 12 0; +#X connect 14 0 18 0; +#X connect 14 0 22 1; +#X connect 15 0 8 1; +#X connect 16 0 7 1; +#X connect 17 0 22 0; +#X connect 18 0 19 0; +#X connect 19 0 17 1; +#X connect 20 0 8 0; +#X connect 20 1 7 0; +#X connect 20 3 11 0; +#X connect 20 4 13 0; +#X connect 20 5 2 0; +#X connect 21 0 23 1; +#X connect 21 0 17 0; +#X connect 21 0 30 1; +#X connect 22 0 16 0; +#X connect 22 0 15 0; +#X connect 23 0 21 0; +#X connect 24 0 23 0; +#X connect 25 0 28 0; +#X connect 26 0 25 0; +#X connect 26 1 24 0; +#X connect 28 0 29 0; +#X connect 29 0 30 0; +#X connect 30 0 21 0; +#X restore 310 114 pd digital-out; +#N canvas 37 230 541 377 pinMode 0; +#X obj 51 8 inlet; +#X obj 51 350 outlet; +#X text 141 54 pin#; +#X text 321 56 mode; +#X obj 174 147 moses 128; +#X msg 51 227 244; +#X text 194 131 do bounds checking to be safe; +#X obj 51 252 pack float float float; +#X obj 279 147 moses 128; +#X obj 225 255 bang; +#X obj 225 320 list trim; +#X obj 225 300 list prepend ERROR:; +#X msg 225 275 pinMode pin# greater than 127; +#X obj 330 213 bang; +#X msg 330 233 pinMode mode greater than 127; +#X obj 225 340 print [arduino]; +#N canvas 577 324 396 304 turn 0; +#X obj 123 21 inlet; +#X obj 43 21 inlet; +#X obj 123 78 select 0; +#X text 178 78 INPUT; +#X obj 215 252 outlet; +#X obj 110 135 spigot; +#X msg 123 109 1; +#X obj 215 180 >> 3; +#X obj 110 158 trigger bang float; +#X msg 152 109 0; +#X text 254 201 0xD0; +#X obj 215 201 + 208; +#X obj 215 228 pack float 1; +#X text 42 202 generate digitalIns message; +#X connect 0 0 2 0; +#X connect 1 0 5 0; +#X connect 2 0 6 0; +#X connect 5 0 8 0; +#X connect 6 0 5 1; +#X connect 7 0 11 0; +#X connect 8 0 9 0; +#X connect 8 1 7 0; +#X connect 9 0 5 1; +#X connect 11 0 12 0; +#X connect 12 0 4 0; +#X restore 174 184 pd turn digital reporting on; +#X obj 51 32 trigger bang anything; +#X obj 309 78 route float symbol; +#N canvas 0 76 450 300 s2f 0; +#X obj 72 14 inlet; +#X obj 72 265 outlet; +#X obj 72 69 select input output analog pwm servo; +#X obj 285 262 outlet; +#X msg 72 95 0; +#X msg 114 95 1; +#X msg 157 95 2; +#X msg 199 95 3; +#X msg 242 95 4; +#X connect 0 0 2 0; +#X connect 2 0 4 0; +#X connect 2 1 5 0; +#X connect 2 2 6 0; +#X connect 2 3 7 0; +#X connect 2 4 8 0; +#X connect 2 5 3 0; +#X connect 4 0 1 0; +#X connect 5 0 1 0; +#X connect 6 0 1 0; +#X connect 7 0 1 0; +#X connect 8 0 1 0; +#X restore 361 99 pd s2f; +#X obj 414 120 list; +#X msg 414 141 unknown pinMode: \$1; +#X obj 174 55 list split 1; +#X connect 0 0 17 0; +#X connect 4 0 7 1; +#X connect 4 0 16 0; +#X connect 4 1 9 0; +#X connect 5 0 7 0; +#X connect 7 0 1 0; +#X connect 8 0 7 2; +#X connect 8 0 16 1; +#X connect 8 1 13 0; +#X connect 9 0 12 0; +#X connect 10 0 15 0; +#X connect 11 0 10 0; +#X connect 12 0 11 0; +#X connect 13 0 14 0; +#X connect 14 0 11 0; +#X connect 16 0 1 0; +#X connect 17 0 5 0; +#X connect 17 1 22 0; +#X connect 18 0 8 0; +#X connect 18 1 19 0; +#X connect 18 2 20 0; +#X connect 19 0 8 0; +#X connect 19 1 20 0; +#X connect 20 0 21 0; +#X connect 21 0 11 0; +#X connect 22 0 4 0; +#X connect 22 1 18 0; +#X restore 237 93 pd pinMode; +#N canvas 300 396 372 380 pwm 0; +#X obj 44 14 inlet; +#X obj 44 312 outlet; +#X obj 44 79 unpack float float; +#X obj 44 124 + 224; +#X text 78 125 0xE0; +#X obj 44 212 pack float float float; +#X obj 149 126 * 255; +#X obj 173 165 >> 7; +#X obj 108 165 & 127; +#X connect 0 0 2 0; +#X connect 2 0 3 0; +#X connect 2 1 6 0; +#X connect 3 0 5 0; +#X connect 5 0 1 0; +#X connect 6 0 7 0; +#X connect 6 0 8 0; +#X connect 7 0 5 2; +#X connect 8 0 5 1; +#X restore 24 94 pd pwm; +#X msg 477 113 249; +#N canvas 0 50 462 312 analogIns 0; +#X obj 64 7 inlet; +#X obj 64 263 outlet; +#X obj 64 65 unpack float float; +#X obj 64 175 pack float float; +#X obj 169 95 select 0; +#X obj 214 118 bang; +#X msg 214 140 1; +#X msg 169 117 0; +#X obj 64 124 + 192; +#X obj 64 95 moses 16; +#X text 100 123 0xC0; +#X connect 0 0 2 0; +#X connect 2 0 9 0; +#X connect 2 1 4 0; +#X connect 3 0 1 0; +#X connect 4 0 7 0; +#X connect 4 1 5 0; +#X connect 5 0 6 0; +#X connect 6 0 3 1; +#X connect 7 0 3 1; +#X connect 8 0 3 0; +#X connect 9 0 8 0; +#X restore 69 94 pd analogIns; +#N canvas 592 114 341 294 digitalIns 0; +#X obj 87 26 inlet; +#X obj 87 250 outlet; +#X text 126 117 0xD0; +#X obj 87 90 unpack float float; +#X obj 87 146 pack float float; +#X obj 87 117 + 208; +#X connect 0 0 3 0; +#X connect 3 0 5 0; +#X connect 3 1 4 1; +#X connect 4 0 1 0; +#X connect 5 0 4 0; +#X restore 150 94 pd digitalIns; +#N canvas 623 398 451 466 sysex 0; +#X obj 62 424 outlet; +#X obj 28 22 inlet; +#X obj 28 145 list split 1; +#X obj 62 321 list prepend; +#X obj 62 177 route bang; +#X text 68 22 sysex; +#X obj 250 22 inlet; +#X text 286 21 string; +#X obj 250 155 trigger anything bang; +#X text 398 176 0x71; +#X msg 373 177 113; +#N canvas 363 261 467 461 split 0; +#X text 87 12 Firmata sends 8-bit chars as two 7-bit bytes; +#X obj 32 12 inlet; +#X obj 32 367 outlet; +#X obj 168 173 list; +#X obj 189 112 route bang; +#X obj 189 137 bang; +#X obj 32 54 trigger bang anything; +#X obj 155 89 list split 1; +#X obj 110 208 trigger bang anything anything; +#X text 256 191 LSB; +#X obj 226 298 % 128; +#X text 267 297 only 7-bits of data allowed; +#X text 204 190 MSB; +#X obj 198 234 >> 7; +#X text 235 137 bang resets once finished; +#N canvas 0 50 313 216 tolist 0; +#X obj 89 50 inlet; +#X obj 179 50 inlet; +#X obj 89 155 outlet; +#N canvas 140 104 344 212 msg 0; +#X obj 12 13 inlet; +#X obj 12 113 outlet; +#X msg 12 33; +#X connect 0 0 2 0; +#X connect 2 0 1 0; +#X restore 89 124 pd msg; +#X msg 179 70 add2 \$1; +#X msg 89 86 bang \, set; +#X connect 0 0 5 0; +#X connect 1 0 4 0; +#X connect 3 0 2 0; +#X connect 4 0 3 0; +#X connect 5 0 3 0; +#X restore 32 344 pd tolist; +#X connect 1 0 6 0; +#X connect 3 0 7 0; +#X connect 4 0 5 0; +#X connect 4 1 3 1; +#X connect 5 0 3 1; +#X connect 6 0 15 0; +#X connect 6 1 7 0; +#X connect 7 0 8 0; +#X connect 7 1 4 0; +#X connect 8 0 3 0; +#X connect 8 1 13 0; +#X connect 8 2 10 0; +#X connect 10 0 15 1; +#X connect 13 0 10 0; +#X connect 15 0 2 0; +#X restore 119 212 pd split into 7-bit bytes; +#X obj 62 344 list prepend 240; +#X text 168 345 0xF0 start_sysex; +#X text 167 366 0xF7 end_sysex; +#X obj 62 366 list append 247; +#X obj 28 66 trigger anything anything; +#X msg 175 87 \$1; +#X connect 1 0 16 0; +#X connect 2 1 4 0; +#X connect 3 0 12 0; +#X connect 4 0 3 0; +#X connect 4 1 11 0; +#X connect 6 0 8 0; +#X connect 8 0 11 0; +#X connect 8 1 10 0; +#X connect 10 0 3 1; +#X connect 11 0 3 0; +#X connect 12 0 15 0; +#X connect 15 0 0 0; +#X connect 16 0 2 0; +#X connect 16 1 17 0; +#X connect 17 0 3 1; +#X restore 860 113 pd sysex; +#N canvas 107 521 569 343 port-out 0; +#X obj 13 15 inlet; +#X obj 167 281 outlet; +#X msg 244 82 \$1; +#X text 343 149 add channel to command; +#X text 309 190 0x90; +#X obj 271 191 + 144; +#X obj 244 129 moses; +#X obj 13 55 trigger bang anything anything anything; +#X obj 271 149 moses 16; +#X obj 353 219 print [arduino]; +#X msg 353 197 ERROR: no such channel: \$1; +#X msg 167 82 \$2; +#X msg 90 82 \$2; +#X obj 167 129 & 127; +#X obj 90 130 & 128; +#X obj 90 151 == 128; +#X obj 21 285 outlet; +#X obj 36 230 * 8; +#X obj 21 251 <<; +#X connect 0 0 7 0; +#X connect 2 0 6 0; +#X connect 5 0 1 0; +#X connect 6 0 10 0; +#X connect 6 1 8 0; +#X connect 7 1 12 0; +#X connect 7 2 11 0; +#X connect 7 3 2 0; +#X connect 8 0 5 0; +#X connect 8 0 17 0; +#X connect 8 1 10 0; +#X connect 10 0 9 0; +#X connect 11 0 13 0; +#X connect 12 0 14 0; +#X connect 12 0 18 0; +#X connect 13 0 1 0; +#X connect 14 0 15 0; +#X connect 15 0 1 0; +#X connect 17 0 18 1; +#X connect 18 0 16 0; +#X restore 403 114 pd port-out; +#N canvas 429 494 450 300 samplingInterval 0; +#X obj 39 252 outlet; +#X obj 38 21 inlet; +#X text 156 54 LSB; +#X obj 39 131 % 128; +#X text 103 54 MSB; +#X obj 39 107 >> 7; +#X obj 39 153 pack float float; +#X obj 132 130 % 128; +#X text 172 129 only 7-bit chunks of data allowed; +#X msg 39 188 240 122 \$2 \$1 247; +#X text 152 189 START_SYSEX 0x7A LSB MSB END_SYSEX; +#X obj 39 71 trigger anything anything; +#X connect 1 0 11 0; +#X connect 3 0 6 0; +#X connect 5 0 3 0; +#X connect 6 0 9 0; +#X connect 7 0 6 1; +#X connect 9 0 0 0; +#X connect 11 0 5 0; +#X connect 11 1 7 0; +#X restore 733 113 pd samplingInterval; +#X obj 24 51 route pwm analog analogIns digitalIns pinMode; +#X obj 952 108 t a; +#X msg 506 143 240 \$1 247; +#X msg 506 113 121; +#X msg 536 113 107; +#N canvas 0 50 421 260 pinState 0; +#X obj 15 20 inlet; +#X obj 15 200 outlet; +#X obj 15 56 route float; +#X obj 15 78 moses 128; +#X obj 99 154 print [arduino]; +#X msg 99 129 ERROR: invalid pin for pinState query: \$1; +#X obj 99 104 list; +#X msg 15 177 240 109 \$1 247; +#X connect 0 0 2 0; +#X connect 2 0 3 0; +#X connect 2 1 6 0; +#X connect 3 0 7 0; +#X connect 3 1 5 0; +#X connect 5 0 4 0; +#X connect 6 0 5 0; +#X connect 7 0 1 0; +#X restore 582 113 pd pinState; +#X obj 310 51 route digital port version firmware capability pinState; +#X obj 661 52 route analogMapping samplingInterval sysex string; +#X msg 661 113 105; +#X connect 0 0 11 0; +#X connect 2 0 1 0; +#X connect 3 0 1 0; +#X connect 4 0 1 0; +#X connect 5 0 1 0; +#X connect 6 0 1 0; +#X connect 7 0 1 0; +#X connect 8 0 1 0; +#X connect 9 0 2 1; +#X connect 9 1 1 0; +#X connect 10 0 1 0; +#X connect 11 0 4 0; +#X connect 11 1 4 0; +#X connect 11 2 6 0; +#X connect 11 3 7 0; +#X connect 11 4 3 0; +#X connect 11 5 17 0; +#X connect 12 0 1 0; +#X connect 13 0 1 0; +#X connect 14 0 13 0; +#X connect 15 0 13 0; +#X connect 16 0 1 0; +#X connect 17 0 2 0; +#X connect 17 1 9 0; +#X connect 17 2 5 0; +#X connect 17 3 14 0; +#X connect 17 4 15 0; +#X connect 17 5 16 0; +#X connect 17 6 18 0; +#X connect 18 0 19 0; +#X connect 18 1 10 0; +#X connect 18 2 8 0; +#X connect 18 3 8 1; +#X connect 18 4 12 0; +#X connect 19 0 13 0; +#X restore 32 89 pd command processing; +#X text 28 38 processed input; +#N canvas 590 443 467 421 make 0; +#X obj 28 6 inlet; +#X obj 133 332 outlet; +#X obj 28 52 moses 128; +#X obj 130 100 trigger float float; +#N canvas 459 506 653 358 set 0; +#X obj 26 3 inlet; +#X obj 34 307 outlet; +#X text 85 31 0xF0; +#X obj 26 31 moses 240; +#X text 79 307 length in byte count; +#X msg 283 122 2; +#X obj 26 60 & 240; +#X obj 26 101 select 144 160 176 192 208 224; +#X text 29 86 0x90 0xA0 0xB0 0xC0 0xD0 0xE0; +#X msg 251 122 2; +#X text 282 83 0xF4 0xF9; +#X obj 195 242 print [arduino]_WARNING_currently_unsupported; +#X msg 55 122 160; +#X msg 26 122 2; +#X msg 85 122 176; +#X msg 114 122 1; +#X msg 144 122 1; +#X msg 173 122 2; +#X text 348 69 sysex; +#X msg 315 122 999999; +#X text 362 121 <-- sets sysex size limit; +#X text 62 60 strip channel info; +#X text 342 83 0xF0; +#X obj 251 101 select 244 249 240; +#X connect 0 0 3 0; +#X connect 3 0 6 0; +#X connect 3 1 23 0; +#X connect 5 0 1 0; +#X connect 6 0 7 0; +#X connect 7 0 13 0; +#X connect 7 1 12 0; +#X connect 7 2 14 0; +#X connect 7 3 15 0; +#X connect 7 4 16 0; +#X connect 7 5 17 0; +#X connect 9 0 1 0; +#X connect 12 0 11 0; +#X connect 13 0 1 0; +#X connect 14 0 11 0; +#X connect 15 0 1 0; +#X connect 16 0 1 0; +#X connect 17 0 1 0; +#X connect 19 0 1 0; +#X connect 23 0 9 0; +#X connect 23 1 5 0; +#X connect 23 2 19 0; +#X restore 241 127 pd set message length; +#X obj 79 250 select 0; +#X obj 79 228 float; +#X obj 117 228 - 1; +#X obj 79 178 trigger bang float; +#X text 89 52 only process command bytes; +#X text 140 78 end of sysex; +#X obj 79 79 route 247; +#X obj 79 100 bang; +#N canvas 0 50 313 216 tolist 0; +#X obj 89 50 inlet; +#X obj 179 50 inlet; +#X obj 89 155 outlet; +#N canvas 140 104 344 212 msg 0; +#X obj 12 13 inlet; +#X obj 12 113 outlet; +#X msg 12 33 235; +#X connect 0 0 2 0; +#X connect 2 0 1 0; +#X restore 89 124 pd msg; +#X msg 179 70 add2 \$1; +#X msg 89 86 bang \, set; +#X connect 0 0 5 0; +#X connect 1 0 4 0; +#X connect 3 0 2 0; +#X connect 4 0 3 0; +#X connect 5 0 3 0; +#X restore 133 308 pd tolist; +#X connect 0 0 2 0; +#X connect 2 0 8 0; +#X connect 2 1 11 0; +#X connect 3 0 8 0; +#X connect 3 1 4 0; +#X connect 4 0 6 1; +#X connect 5 0 13 0; +#X connect 6 0 7 0; +#X connect 6 0 5 0; +#X connect 7 0 6 1; +#X connect 8 0 6 0; +#X connect 8 1 13 1; +#X connect 11 0 12 0; +#X connect 11 1 3 0; +#X connect 12 0 13 0; +#X connect 13 0 1 0; +#X restore 32 199 pd make lists; +#N canvas 0 50 525 269 check 0; +#X obj 47 62 inlet; +#X obj 47 88 route version; +#X obj 47 127 unpack float float; +#X obj 92 171 print [arduino]_WARNING_INCOMPATIBLE_FIRMWARE_VERSION; +#X obj 47 149 select 2; +#X text 102 150 <-- sets the protocol major version this is compatible with; +#X connect 0 0 1 0; +#X connect 1 0 2 0; +#X connect 2 0 4 0; +#X connect 4 1 3 0; +#X restore 215 325 pd check version; +#N canvas 192 246 541 319 convert 0; +#X obj 142 278 outlet; +#N canvas 234 468 335 267 analog 0; +#X obj 65 16 inlet; +#X obj 65 213 outlet; +#X msg 65 150 analog \$1 \$2; +#X obj 65 129 pack float float; +#X obj 158 103 / 1023; +#X text 203 104 scale to 0-1; +#X obj 65 71 unpack float float; +#X connect 0 0 6 0; +#X connect 2 0 1 0; +#X connect 3 0 2 0; +#X connect 4 0 3 1; +#X connect 6 0 3 0; +#X connect 6 1 4 0; +#X restore 342 174 pd analog messages; +#X obj 97 13 inlet; +#N canvas 325 132 888 458 sysex 0; +#X obj 30 11 inlet; +#X obj 30 398 outlet; +#N canvas 990 306 450 300 firmware 0; +#X obj 91 6 inlet; +#X obj 91 272 outlet; +#X obj 91 170 list prepend; +#X obj 91 206 list prepend firmware; +#X obj 91 239 list trim; +#X obj 91 39 list split 2; +#N canvas 736 297 645 461 reassemble 0; +#X text 91 24 Firmata sends 8-bit chars as two 7-bit bytes; +#X obj 36 24 inlet; +#X obj 36 411 outlet; +#X obj 159 131 list split 2; +#X obj 196 206 list; +#X obj 109 256 trigger bang anything; +#X obj 232 280 unpack float float; +#X obj 232 340 +; +#X obj 193 154 route bang; +#X obj 337 303 << 7; +#X obj 193 179 bang; +#X obj 36 106 trigger bang anything; +#X text 249 179 reset the list if end of list or there is a single byte left over; +#N canvas 0 50 313 216 tolist 0; +#X obj 89 50 inlet; +#X obj 179 50 inlet; +#X obj 89 155 outlet; +#N canvas 140 104 344 212 msg 0; +#X obj 12 13 inlet; +#X obj 12 113 outlet; +#X msg 12 33; +#X connect 0 0 2 0; +#X connect 2 0 1 0; +#X restore 89 124 pd msg; +#X msg 179 70 add2 \$1; +#X msg 89 86 bang \, set; +#X connect 0 0 5 0; +#X connect 1 0 4 0; +#X connect 3 0 2 0; +#X connect 4 0 3 0; +#X connect 5 0 3 0; +#X restore 36 381 pd tolist; +#X connect 1 0 11 0; +#X connect 3 0 5 0; +#X connect 3 1 8 0; +#X connect 3 2 10 0; +#X connect 4 0 3 0; +#X connect 5 0 4 0; +#X connect 5 1 6 0; +#X connect 6 0 7 0; +#X connect 6 1 9 0; +#X connect 7 0 13 1; +#X connect 8 0 10 0; +#X connect 8 1 4 1; +#X connect 9 0 7 1; +#X connect 10 0 4 1; +#X connect 11 0 13 0; +#X connect 11 1 3 0; +#X connect 13 0 2 0; +#X restore 160 79 pd reassemble chars; +#X obj 160 116 list tosymbol; +#X connect 0 0 5 0; +#X connect 2 0 3 0; +#X connect 3 0 4 0; +#X connect 4 0 1 0; +#X connect 5 0 2 0; +#X connect 5 1 6 0; +#X connect 5 2 6 0; +#X connect 6 0 7 0; +#X connect 7 0 2 1; +#X restore 30 220 pd firmware; +#N canvas 830 319 667 494 assemble 0; +#X text 91 24 Firmata sends 8-bit chars as two 7-bit bytes; +#X obj 36 24 inlet; +#X obj 36 408 outlet; +#X obj 159 131 list split 2; +#X obj 196 206 list; +#X obj 109 256 trigger bang anything; +#X obj 232 280 unpack float float; +#X obj 232 323 +; +#X obj 193 154 route bang; +#X obj 337 303 << 7; +#X obj 193 179 bang; +#X obj 36 106 trigger bang anything; +#X text 249 179 reset the list if end of list or there is a single byte left over; +#N canvas 0 50 313 216 tolist 0; +#X obj 89 50 inlet; +#X obj 179 50 inlet; +#X obj 89 155 outlet; +#N canvas 140 104 344 212 msg 0; +#X obj 12 13 inlet; +#X obj 12 113 outlet; +#X msg 12 33; +#X connect 0 0 2 0; +#X connect 2 0 1 0; +#X restore 89 124 pd msg; +#X msg 179 70 add2 \$1; +#X msg 89 86 bang \, set; +#X connect 0 0 5 0; +#X connect 1 0 4 0; +#X connect 3 0 2 0; +#X connect 4 0 3 0; +#X connect 5 0 3 0; +#X restore 36 366 pd tolist; +#X connect 1 0 11 0; +#X connect 3 0 5 0; +#X connect 3 1 8 0; +#X connect 3 2 10 0; +#X connect 4 0 3 0; +#X connect 5 0 4 0; +#X connect 5 1 6 0; +#X connect 6 0 7 0; +#X connect 6 1 9 0; +#X connect 7 0 13 1; +#X connect 8 0 10 0; +#X connect 8 1 4 1; +#X connect 9 0 7 1; +#X connect 10 0 4 1; +#X connect 11 0 13 0; +#X connect 11 1 3 0; +#X connect 13 0 2 0; +#X restore 115 244 pd assemble 7-bit into 14-bit values; +#X obj 115 293 list prepend; +#X obj 115 314 list trim; +#X msg 275 188 string; +#X msg 184 185 servo_config; +#X text 71 396 data; +#X obj 138 398 outlet; +#X text 184 398 status; +#X obj 30 59 route 121; +#X obj 101 84 route 112; +#X obj 172 104 route 113; +#X obj 101 104 t a b; +#X obj 172 124 t a b; +#X text 95 60 0x79 firmware; +#X obj 388 138 route 108; +#X text 452 139 0x6C Capability; +#X text 237 106 0x71 string; +#X text 162 84 0x70 servo (where is this documented?); +#N canvas 268 50 540 585 capability 0; +#X obj 14 41 t b a a; +#X obj 306 13 table \$0.capability; +#X msg 53 90 resize \$1; +#X obj 53 64 list length; +#X obj 14 19 inlet; +#X obj 53 141 s \$0.capability; +#X obj 33 212 until; +#X obj 14 139 f; +#X obj 33 113 list prepend 0; +#X obj 14 169 t b a b; +#X obj 33 237 f; +#X msg 76 212 0; +#X obj 33 260 t a a; +#X obj 84 248 + 1; +#X obj 33 285 tabread \$0.capability; +#X obj 72 565 outlet; +#X obj 33 310 sel 127; +#X text 84 310 bump pin number; +#X obj 132 378 t a; +#X obj 99 377 == 1; +#X obj 120 337 t b b; +#X msg 120 357 1; +#X obj 72 357 t a b; +#X obj 72 401 list prepend; +#X obj 72 420 route 1 0; +#X obj 72 476 list prepend; +#X obj 72 439 pack f f; +#X obj 198 384 f; +#X obj 198 406 + 1; +#X obj 198 430 t a a; +#N canvas 372 119 398 398 conver_to_human_readable 0; +#X obj 9 10 inlet; +#X obj 9 375 outlet; +#X obj 9 31 unpack f f f; +#X obj 43 53 sel 0 1 2 3 4 5 6 7 8 9 10 11; +#X msg 43 294 DIGITAL_INPUT; +#X msg 57 274 DIGITAL_OUTPUT; +#X msg 71 255 ANALOG_INPUT; +#X msg 85 236 PWM; +#X msg 100 218 SERVO; +#X msg 114 200 SHIFT; +#X msg 128 180 I2C; +#X msg 142 161 ONEWIRE; +#X msg 157 140 STEPPER; +#X msg 171 121 ENCODER; +#X msg 185 101 SERIAL; +#X msg 199 80 INPUT_PULLUP; +#X obj 171 329 list; +#X obj 9 351 pack f s f; +#X connect 0 0 2 0; +#X connect 2 0 17 0; +#X connect 2 1 3 0; +#X connect 2 2 17 2; +#X connect 3 0 4 0; +#X connect 3 1 5 0; +#X connect 3 2 6 0; +#X connect 3 3 7 0; +#X connect 3 4 8 0; +#X connect 3 5 9 0; +#X connect 3 6 10 0; +#X connect 3 7 11 0; +#X connect 3 8 12 0; +#X connect 3 9 13 0; +#X connect 3 10 14 0; +#X connect 3 11 15 0; +#X connect 4 0 16 0; +#X connect 5 0 16 0; +#X connect 6 0 16 0; +#X connect 7 0 16 0; +#X connect 8 0 16 0; +#X connect 9 0 16 0; +#X connect 10 0 16 0; +#X connect 11 0 16 0; +#X connect 12 0 16 0; +#X connect 13 0 16 0; +#X connect 14 0 16 0; +#X connect 15 0 16 0; +#X connect 16 0 17 1; +#X connect 17 0 1 0; +#X restore 72 497 pd conver_to_human_readable; +#X msg 72 458 \$2 \$1; +#X text 177 476 pin# \, mode \, resolution; +#X text 240 404 count pin#; +#X obj 72 522 list prepend capability; +#X obj 72 542 list trim; +#X msg 14 457 end; +#X msg 359 463 begin; +#X connect 0 0 7 0; +#X connect 0 1 8 0; +#X connect 0 2 3 0; +#X connect 2 0 5 0; +#X connect 3 0 2 0; +#X connect 3 0 7 1; +#X connect 4 0 0 0; +#X connect 6 0 10 0; +#X connect 7 0 9 0; +#X connect 8 0 5 0; +#X connect 9 0 36 0; +#X connect 9 1 6 0; +#X connect 9 2 11 0; +#X connect 9 2 37 0; +#X connect 10 0 12 0; +#X connect 11 0 10 1; +#X connect 11 0 29 0; +#X connect 12 0 14 0; +#X connect 12 1 13 0; +#X connect 13 0 10 1; +#X connect 14 0 16 0; +#X connect 16 0 20 0; +#X connect 16 1 22 0; +#X connect 18 0 19 1; +#X connect 19 0 18 0; +#X connect 19 0 23 1; +#X connect 20 0 21 0; +#X connect 20 1 27 0; +#X connect 21 0 19 1; +#X connect 22 0 23 0; +#X connect 22 1 19 0; +#X connect 23 0 24 0; +#X connect 24 0 26 0; +#X connect 24 1 26 1; +#X connect 25 0 30 0; +#X connect 26 0 31 0; +#X connect 27 0 28 0; +#X connect 28 0 29 0; +#X connect 29 0 25 1; +#X connect 29 1 27 1; +#X connect 30 0 34 0; +#X connect 31 0 25 0; +#X connect 34 0 35 0; +#X connect 35 0 15 0; +#X connect 36 0 34 0; +#X connect 37 0 34 0; +#X restore 388 184 pd capability; +#X obj 544 171 route 110; +#X text 607 172 0x6E Pin State; +#N canvas 268 50 386 285 pinState 0; +#X obj 14 19 inlet; +#X obj 14 215 outlet; +#N canvas 0 50 386 373 convert_to_human_readable 0; +#X obj 51 48 sel 0 1 2 3 4 5 6 7 8 9 10 11; +#X msg 51 289 DIGITAL_INPUT; +#X msg 65 269 DIGITAL_OUTPUT; +#X msg 79 250 ANALOG_INPUT; +#X msg 93 231 PWM; +#X msg 108 213 SERVO; +#X msg 122 195 SHIFT; +#X msg 136 175 I2C; +#X msg 150 156 ONEWIRE; +#X msg 165 135 STEPPER; +#X msg 179 116 ENCODER; +#X msg 193 96 SERIAL; +#X msg 207 75 INPUT_PULLUP; +#X obj 179 324 list; +#X obj 51 19 inlet; +#X obj 179 346 outlet; +#X connect 0 0 1 0; +#X connect 0 1 2 0; +#X connect 0 2 3 0; +#X connect 0 3 4 0; +#X connect 0 4 5 0; +#X connect 0 5 6 0; +#X connect 0 6 7 0; +#X connect 0 7 8 0; +#X connect 0 8 9 0; +#X connect 0 9 10 0; +#X connect 0 10 11 0; +#X connect 0 11 12 0; +#X connect 1 0 13 0; +#X connect 2 0 13 0; +#X connect 3 0 13 0; +#X connect 4 0 13 0; +#X connect 5 0 13 0; +#X connect 6 0 13 0; +#X connect 7 0 13 0; +#X connect 8 0 13 0; +#X connect 9 0 13 0; +#X connect 10 0 13 0; +#X connect 11 0 13 0; +#X connect 12 0 13 0; +#X connect 13 0 15 0; +#X connect 14 0 0 0; +#X restore 71 120 pd convert_to_human_readable; +#X obj 14 54 list split 2; +#X obj 14 81 unpack f f; +#X obj 14 161 pack f s f; +#X msg 14 186 pinState \$1 \$2 \$3; +#X msg 135 186 pinState \$1 NOT_PRESENT; +#X connect 0 0 3 0; +#X connect 2 0 5 1; +#X connect 3 0 4 0; +#X connect 3 1 5 2; +#X connect 3 2 7 0; +#X connect 4 0 5 0; +#X connect 4 1 2 0; +#X connect 5 0 6 0; +#X connect 6 0 1 0; +#X connect 7 0 1 0; +#X restore 544 200 pd pinState; +#X obj 639 196 route 106; +#X text 704 195 0x6A Analog Mapping; +#N canvas 288 35 536 407 analogMapping 0; +#X obj 12 7 inlet; +#X obj 70 361 outlet; +#X obj 12 27 t b a a; +#X msg 51 72 resize \$1; +#X obj 51 47 list length; +#X obj 31 165 until; +#X obj 12 119 f; +#X obj 31 90 list prepend 0; +#X obj 12 144 t b a b; +#X obj 31 190 f; +#X msg 74 165 0; +#X obj 92 201 + 1; +#X obj 51 125 s \$0.analogMapping; +#X obj 178 14 table \$0.analogMapping; +#X obj 31 245 tabread \$0.analogMapping; +#X obj 31 265 sel 127; +#X obj 70 288 pack f f; +#X obj 31 213 t a a a; +#X obj 70 318 list prepend analogMapping; +#X obj 70 338 list trim; +#X msg 208 249 begin; +#X msg 12 285 end; +#X connect 0 0 2 0; +#X connect 2 0 6 0; +#X connect 2 1 7 0; +#X connect 2 2 4 0; +#X connect 3 0 12 0; +#X connect 4 0 3 0; +#X connect 4 0 6 1; +#X connect 5 0 9 0; +#X connect 6 0 8 0; +#X connect 7 0 12 0; +#X connect 8 0 21 0; +#X connect 8 1 5 0; +#X connect 8 2 10 0; +#X connect 8 2 20 0; +#X connect 9 0 17 0; +#X connect 10 0 9 1; +#X connect 11 0 9 1; +#X connect 14 0 15 0; +#X connect 15 1 16 0; +#X connect 16 0 18 0; +#X connect 17 0 14 0; +#X connect 17 1 16 1; +#X connect 17 2 11 0; +#X connect 18 0 19 0; +#X connect 19 0 1 0; +#X connect 20 0 18 0; +#X connect 21 0 18 0; +#X restore 639 223 pd analogMapping; +#X connect 0 0 11 0; +#X connect 2 0 9 0; +#X connect 3 0 4 0; +#X connect 4 0 5 0; +#X connect 5 0 1 0; +#X connect 6 0 4 1; +#X connect 7 0 4 1; +#X connect 11 0 2 0; +#X connect 11 1 12 0; +#X connect 12 0 14 0; +#X connect 12 1 13 0; +#X connect 13 0 15 0; +#X connect 13 1 17 0; +#X connect 14 0 3 0; +#X connect 14 1 7 0; +#X connect 15 0 3 0; +#X connect 15 1 6 0; +#X connect 17 0 21 0; +#X connect 17 1 22 0; +#X connect 21 0 9 0; +#X connect 22 0 24 0; +#X connect 22 1 25 0; +#X connect 24 0 9 0; +#X connect 25 0 27 0; +#X connect 27 0 9 0; +#X restore 134 174 pd sysex; +#N canvas 383 77 457 452 route 0; +#X obj 46 24 inlet; +#X obj 175 400 outlet; +#X obj 233 400 outlet; +#X obj 46 91 trigger anything anything; +#X obj 292 400 outlet; +#X obj 175 339 route digital analog; +#X msg 193 115 \$1; +#X obj 244 158 moses 224; +#X text 314 157 0xE0 analog messages; +#X obj 193 136 moses 144; +#X text 257 136 0x90 digital messages; +#X obj 244 209 bang; +#X obj 295 209 bang; +#X msg 244 236 digital; +#X msg 297 236 analog; +#X text 359 178 0xF0; +#X obj 346 236 bang; +#X obj 211 236 bang; +#N canvas 176 360 335 257 parse 0; +#X obj 73 18 inlet; +#X obj 73 215 outlet; +#X obj 73 161 pack float float; +#X obj 73 64 unpack float float float; +#X obj 166 110 +; +#X obj 214 85 << 7; +#X obj 73 85 & 15; +#X connect 0 0 3 0; +#X connect 2 0 1 0; +#X connect 3 0 6 0; +#X connect 3 1 4 0; +#X connect 3 2 5 0; +#X connect 4 0 2 1; +#X connect 5 0 4 1; +#X connect 6 0 2 0; +#X restore 46 167 pd parse messages; +#X obj 295 178 moses 240; +#X obj 175 279 list prepend; +#X obj 175 301 list trim; +#X connect 0 0 3 0; +#X connect 3 0 18 0; +#X connect 3 1 6 0; +#X connect 5 0 1 0; +#X connect 5 1 2 0; +#X connect 5 2 4 0; +#X connect 6 0 9 0; +#X connect 7 0 11 0; +#X connect 7 1 19 0; +#X connect 9 0 17 0; +#X connect 9 1 7 0; +#X connect 11 0 13 0; +#X connect 12 0 14 0; +#X connect 13 0 20 1; +#X connect 14 0 20 1; +#X connect 16 0 20 1; +#X connect 17 0 20 1; +#X connect 18 0 20 0; +#X connect 19 0 12 0; +#X connect 19 1 16 0; +#X connect 20 0 21 0; +#X connect 21 0 5 0; +#X restore 205 86 pd route digital/analog; +#X obj 97 75 route 249 240; +#X text 124 60 0xF9 0xF0; +#X msg 40 174 version \$1 \$2; +#X obj 263 277 outlet; +#X text 312 279 status outlet; +#X text 184 277 data outlet; +#N canvas 418 242 444 547 digital_messages 0; +#X obj 43 26 inlet; +#X obj 62 416 outlet; +#X obj 43 67 unpack f f, f 30; +#X obj 43 92 t a a a; +#X obj 41 510 table \$0.digital.input.change 16; +#X obj 82 116 tabread \$0.digital.input.change; +#X obj 82 141 expr $f1 ^ $f2; +#X text 181 143 which bits have changed?; +#N canvas 0 238 288 383 byte2bits 0; +#X msg 44 78 8; +#X obj 44 104 until; +#X obj 44 129 f; +#X obj 131 133 + 1; +#X msg 82 105 0; +#X msg 44 179 2 \$1; +#X obj 44 202 pow; +#X obj 44 226 &, f 8; +#X obj 44 153 t a a a, f 12; +#X obj 44 28 inlet; +#X obj 44 52 t b b a; +#X obj 71 303 outlet; +#X obj 44 249 sel 0; +#X obj 71 278 list prepend; +#X connect 0 0 1 0; +#X connect 1 0 2 0; +#X connect 2 0 8 0; +#X connect 3 0 2 1; +#X connect 4 0 2 1; +#X connect 5 0 6 0; +#X connect 6 0 7 0; +#X connect 7 0 12 0; +#X connect 8 0 5 0; +#X connect 8 1 13 1; +#X connect 8 2 3 0; +#X connect 9 0 10 0; +#X connect 10 0 0 0; +#X connect 10 1 4 0; +#X connect 10 2 7 1; +#X connect 12 1 13 0; +#X connect 13 0 11 0; +#X restore 82 174 pd byte2bits; +#X obj 110 278 &, f 14; +#X obj 82 227 t a a a, f 10; +#X msg 110 253 \$2; +#X obj 110 303 >>; +#X text 167 173 serialize bits \, limit to those that changed; +#X obj 62 333 pack f f; +#X obj 62 276 * 8; +#X obj 62 304 +, f 4; +#X text 126 334 digital input (pin \, value); +#X msg 62 387 digital \$1 \$2; +#X obj 43 473 s \$0.digital.input.change; +#X obj 43 448 pack f f, f 30; +#X text 206 472 cache value for later comparison; +#X msg 139 254 \$1; +#X msg 82 253 \$1; +#X text 87 201 <- bit position and corresponding bit mask; +#X connect 0 0 2 0; +#X connect 2 0 3 0; +#X connect 2 1 6 1; +#X connect 2 1 9 1; +#X connect 2 1 20 1; +#X connect 3 0 20 0; +#X connect 3 1 15 0; +#X connect 3 2 5 0; +#X connect 5 0 6 0; +#X connect 6 0 8 0; +#X connect 8 0 10 0; +#X connect 9 0 12 0; +#X connect 10 0 23 0; +#X connect 10 1 11 0; +#X connect 10 2 22 0; +#X connect 11 0 9 0; +#X connect 12 0 14 1; +#X connect 14 0 18 0; +#X connect 15 0 16 0; +#X connect 16 0 14 0; +#X connect 18 0 1 0; +#X connect 20 0 19 0; +#X connect 22 0 12 1; +#X connect 23 0 16 1; +#X restore 205 168 pd digital_messages; +#X obj 340 150 print [arduino]; +#X obj 340 109 list prepend UNKNOWN_RESPONSE; +#X obj 340 129 list trim; +#X connect 1 0 0 0; +#X connect 2 0 5 0; +#X connect 3 0 0 0; +#X connect 3 1 8 0; +#X connect 4 0 11 0; +#X connect 4 1 1 0; +#X connect 4 2 13 0; +#X connect 5 0 7 0; +#X connect 5 1 3 0; +#X connect 5 2 4 0; +#X connect 7 0 8 0; +#X connect 11 0 0 0; +#X connect 13 0 14 0; +#X connect 14 0 12 0; +#X restore 32 259 pd convert to symbolic commands; +#X text 323 361 released under the GNU GPL v2 or later; +#X obj 257 115 print [arduino]; +#X obj 257 57 loadbang; +#X text 254 34 supports Firmata v2.X; +#X text 27 361 (C) Copyright 2006-2012 Free Software Foundation; +#X msg 257 80 version 0.8; +#X obj 32 144 tcpclient; +#X obj 185 101 inlet; +#X obj 360 291 outlet; +#X obj 361 209 tgl 15 0 empty empty connected? 17 7 0 10 #fcfcfc #000000 #000000 0 1; +#X connect 0 0 2 0; +#X connect 2 0 13 0; +#X connect 4 0 6 0; +#X connect 6 0 1 0; +#X connect 6 1 5 0; +#X connect 9 0 12 0; +#X connect 12 0 8 0; +#X connect 13 0 4 0; +#X connect 13 2 16 0; +#X connect 14 0 13 0; +#X connect 16 0 15 0;