Advertisement
Muzer

arduinIO PoC

May 1st, 2013
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.72 KB | None | 0 0
  1. // Proof of concept firmware for ArduinIO board.
  2.  
  3. const int LED = 13; // pin on which the hardwired arduino LED is located
  4. const int VERSION = 1; // version number of this software
  5. const int OUTPUT_SET = 0; // command IDs
  6. const int OUTPUT_GET = 1;
  7. const int INPUT_A = 2;
  8. const int INPUT_D = 3;
  9. const int RESET_STATE = 4;
  10.  
  11. const int OUTPUTS[] = {
  12.   2,
  13.   3,
  14.   4,
  15.   5,
  16.   6,
  17.   7,
  18.   8,
  19.   9
  20. };
  21.  
  22. const int DINPUTS[] = {
  23.   11,
  24.   12,
  25.   A0,
  26.   A1,
  27.   A2,
  28.   A3,
  29.   A4,
  30.   A5
  31. };
  32.  
  33. const int AINPUTS[] = {
  34.   A0,
  35.   A1,
  36.   A2,
  37.   A3,
  38.   A4,
  39.   A5
  40. };
  41.  
  42. void flashSR() // flash SR in morse code from the LED so we know the firmware is installed
  43. {
  44.   digitalWrite(LED, HIGH);
  45.   delay(100);
  46.   digitalWrite(LED, LOW);
  47.   delay(100);
  48.   digitalWrite(LED, HIGH);
  49.   delay(100);
  50.   digitalWrite(LED, LOW);
  51.   delay(100);
  52.   digitalWrite(LED, HIGH);
  53.   delay(100);
  54.   digitalWrite(LED, LOW);
  55.   delay(300);
  56.   digitalWrite(LED, HIGH);
  57.   delay(100);
  58.   digitalWrite(LED, LOW);
  59.   delay(100);
  60.   digitalWrite(LED, HIGH);
  61.   delay(300);
  62.   digitalWrite(LED, LOW);
  63.   delay(100);
  64.   digitalWrite(LED, HIGH);
  65.   delay(100);
  66.   digitalWrite(LED, LOW);
  67. }
  68.  
  69. void flashVer() // not morse code, but number of flashes = version
  70. {
  71.   int i;
  72.   for(i = 0; i < VERSION; i++)
  73.   {
  74.     digitalWrite(LED, HIGH);
  75.     delay(100);
  76.     digitalWrite(LED, LOW);
  77.     delay(200);
  78.   }
  79. }
  80.  
  81. void setPinModes()
  82. {
  83.   int i;
  84.   pinMode(LED, OUTPUT);
  85.   for(i = 0; i < sizeof(OUTPUTS)/sizeof(int); i++)
  86.   {
  87.     pinMode(OUTPUTS[i], OUTPUT);
  88.   }
  89.   for(i = 0; i < sizeof(DINPUTS)/sizeof(int); i++)
  90.   {
  91.     pinMode(DINPUTS[i], INPUT);
  92.   }
  93.   for(i = 0; i < sizeof(AINPUTS)/sizeof(int); i++)
  94.   {
  95.     pinMode(AINPUTS[i], INPUT);
  96.   }
  97. }
  98.  
  99. void setup()
  100. {
  101.   setPinModes();
  102.   flashSR();
  103.   delay(500);
  104.   flashVer();
  105.   Serial.begin(9600); // start serial comms
  106. }
  107.  
  108. void output_set(int *message, int length)
  109. {
  110.   if(length != 1)
  111.     return; // something went wrong...
  112.   int outputs = message[0];
  113.   int i;
  114.   for(i = 0; i < sizeof(OUTPUTS)/sizeof(int); i++, outputs >>= 1)
  115.   {
  116.     digitalWrite(OUTPUTS[i], outputs & 1 ? HIGH : LOW);
  117.   }
  118. }
  119.  
  120. void output_get() // assumes digitalRead on an output returns sanity; will have to be changed if false.
  121. {
  122.   int mask = 1;
  123.   int outputs = 0;
  124.   int i;
  125.   for(i = 0; i < sizeof(OUTPUTS)/sizeof(int); i++, mask <<= 1)
  126.   {
  127.     if(digitalRead(OUTPUTS[i]) == HIGH)
  128.     {
  129.       outputs |= mask;
  130.     }
  131.   }
  132.   Serial.write(1);
  133.   Serial.write(outputs);
  134. }
  135.  
  136. void input_a()
  137. {
  138.   int i;
  139.   Serial.write((sizeof(AINPUTS)/sizeof(int))*2);
  140.   for(i = 0; i < sizeof(AINPUTS)/sizeof(int); i++)
  141.   {
  142.     int toWrite = analogRead(AINPUTS[i]);
  143.     Serial.write(toWrite & 255);
  144.     Serial.write(toWrite >> 8);
  145.   }
  146. }
  147.  
  148. void input_d()
  149. {
  150.   int mask = 1;
  151.   int inputs = 0;
  152.   int i;
  153.   for(i = 0; i < sizeof(DINPUTS)/sizeof(int); i++, mask <<= 1)
  154.   {
  155.     if(digitalRead(DINPUTS[i]) == HIGH)
  156.     {
  157.       inputs |= mask;
  158.     }
  159.   }
  160.   Serial.write(1);
  161.   Serial.write(inputs);
  162. }
  163.  
  164. void reset_state()
  165. {
  166.   Serial.write(1);
  167.   Serial.write(0);
  168. }
  169.  
  170. void loop()
  171. {
  172.   if(Serial.available() > 0)
  173.   {
  174.     int length = Serial.read();
  175.     int i;
  176.     int message[length];
  177.     for(i = 0; i < length; i++)
  178.     {
  179.       while(Serial.available() == 0)
  180.         ; // wait for enough bytes to actually be received
  181.       message[i] = Serial.read();
  182.     }
  183.     switch(message[0]) // command
  184.     {
  185.       case OUTPUT_SET:
  186.         output_set(message + 1, length - 1);
  187.         break;
  188.       case OUTPUT_GET:
  189.         output_get();
  190.         break;
  191.       case INPUT_A:
  192.         input_a();
  193.         break;
  194.       case INPUT_D:
  195.         input_d();
  196.         break;
  197.       case RESET_STATE:
  198.         reset_state();
  199.         break;
  200.       default:
  201.         break;
  202.     }
  203.   }
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement