Liberlab + arduino = LIBERINO

Hej umieszczam tutaj sketch do Liberino czyli Liberlab oparty na Arduino.
Może kogoś to zainteresuje, dla niewtajemniczonych jest to prosty system akwizycji danych, taki prosty Matlab, już nierozwijany, darmowy bardzo fajny do zastosowań hobbystycznych.
Sketch nie jest mojego autorstwa, znalazłem go w sieci, był napisany w środowisku Arduino dla wersji 1.0.
Przy próbie kompilacji miał kilka błędów, poprawiłem je i wstawiłem drobną poprawkę autorstwa Larry-ego,
Teraz działa dobrze, polecam stronę z opisem https://sites.google.com/site/liberlabsite/software

// this sketch provides liberlab emulation
// Read the ADC and send Ax[msb][lsb]
// Read pins ... and send IN[lsb]
// finish with \r\n

// which ADC pins are active:
//               [7][6]543210
uint8_t adc_order = B00001111;

void setup() {
 Serial.begin(9600);
 for (int x = 2; x <=7; x++)
   pinMode(x, OUTPUT);
}

// array to convert Arduino analog pins (0-5) to Liberlab ADC inputs (1-6)
char adc_pin[8] = {'1', '2', '3', '4', '5', '6', 0};
#define highByte(x) (0xFF & (x >> 8))
#define lowByte(x) (0xFF & x)
void adcReport(int pin, int value) {
 Serial.print('A');
 Serial.print(adc_pin[pin]);
 Serial.write(highByte(value));
 Serial.print(lowByte(value));
}

uint8_t readDigital8() {
uint8_t temp = 0;
uint8_t result = PIND; // Read feedback of six digital outputs, pins 2 through 7
// The following swap the bit order as needed by liberlab

if (result & 128) temp = temp + 1;
if (result & 64) temp = temp + 2;
if (result & 32) temp = temp + 4;
if (result & 16) temp = temp + 8;
if (result & 8) temp = temp + 16;
if (result & 4) temp = temp + 32;
result = temp;
return result;
}

void interpret(uint8_t ch) {
 if (ch == 'A') digitalWrite(2, HIGH);
 if (ch == 'a') digitalWrite(2, LOW);
 if (ch == 'B') digitalWrite(3, HIGH);
 if (ch == 'b') digitalWrite(3, LOW);
 if (ch == 'C') digitalWrite(4, HIGH);
 if (ch == 'c') digitalWrite(4, LOW);
 if (ch == 'D') digitalWrite(5, HIGH);
 if (ch == 'd') digitalWrite(5, LOW);
 if (ch == 'E') digitalWrite(6, HIGH);
 if (ch == 'e') digitalWrite(6, LOW);
 if (ch == 'F') digitalWrite(7, HIGH);
 if (ch == 'f') digitalWrite(7, LOW);
 
 // since pins 0 and 1 are used we have the following for digital IO:
 if (ch == 'G') for (int x = 2; x < 7; x++) { digitalWrite(x, HIGH); }
 if (ch == 'G') for (int x = 2; x < 7; x++) { digitalWrite(x, LOW); }
}

#define enabled(x) (adc_order & (1 << x))
void loop() {
 // first read the enabled ADC pins
 // and send the results
 for (int x = 0; x < 6; x++) {
   if (enabled(x) && (x <= 5)) {
     int adc = analogRead(x);
     adcReport(x, adc);
   }
 }
 // now send the digital pin status
 uint8_t status = readDigital8();
 Serial.print("IN");
 Serial.write(status);
 
 // finish with CRLF
 Serial.print("\r\n");
 
 // deal with any input on the serial port
 while (Serial.available()) {
   uint8_t ch = Serial.read();
   interpret(ch);
 }
}