Difference between revisions of "Arduino loop"

From dftwiki3
Jump to: navigation, search
(New page: <code><pre> #include <stdio.h> #include <string.h> char buffer[256]; int len; char *operation; char *mode; char *pin; char *state; void setup(); void loop(); void resetAll(); int proce...)
 
Line 1: Line 1:
 +
--[[User:Thiebaut|D. Thiebaut]] 17:08, 1 November 2008 (UTC)
 +
 +
Status: could make arduino-serial.c program send commands and read from Arduino
 +
 +
=arduino-serial.c=
 
<code><pre>
 
<code><pre>
  
#include <stdio.h>
+
/*
#include <string.h>
+
* Arduino-serial
 +
* --------------
 +
*
 +
* A simple command-line example program showing how a computer can
 +
* communicate with an Arduino board. Works on any POSIX system (Mac/Unix/PC)
 +
*
 +
*
 +
* Compile with something like:
 +
* gcc -o arduino-serial arduino-serial.c
 +
*
 +
* Created 5 December 2006
 +
* Copyleft (c) 2006, Tod E. Kurt, tod@todbot.com
 +
* http://todbot.com/blog/
 +
*
 +
*
 +
* Updated 8 December 2006:
 +
*  Justin McBride discoevered B14400 & B28800 aren't in Linux's termios.h.
 +
*  I've included his patch, but commented out for now.  One really needs a
 +
*  real make system when doing cross-platform C and I wanted to avoid that
 +
*  for this little program. Those baudrates aren't used much anyway. :)
 +
*
 +
* Updated 26 December 2007:
 +
*  Added ability to specify a delay (so you can wait for Arduino Diecimila)
 +
*  Added ability to send a binary byte number
 +
*
 +
* Update 31 August 2008:
 +
*  Added patch to clean up odd baudrates from Andy at hexapodia.org
 +
*
 +
*/
 +
 
 +
#include <stdio.h>    /* Standard input/output definitions */
 +
#include <stdlib.h>  
 +
#include <stdint.h>  /* Standard types */
 +
#include <string.h>  /* String function definitions */
 +
#include <unistd.h>  /* UNIX standard function definitions */
 +
#include <fcntl.h>    /* File control definitions */
 +
#include <errno.h>    /* Error number definitions */
 +
#include <termios.h>  /* POSIX terminal control definitions */
 +
#include <sys/ioctl.h>
 +
#include <getopt.h>
  
 +
void usage(void);
 +
int serialport_init(const char* serialport, int baud);
 +
int serialport_writebyte(int fd, uint8_t b);
 +
int serialport_write(int fd, const char* str);
 +
int serialport_read_until(int fd, char* buf, char until);
  
 +
void usage(void) {
 +
    printf("Usage: arduino-serial -p <serialport> [OPTIONS]\n"
 +
    "\n"
 +
    "Options:\n"
 +
    "  -h, --help                  Print this help message\n"
 +
    "  -p, --port=serialport        Serial port Arduino is on\n"
 +
    "  -b, --baud=baudrate          Baudrate (bps) of Arduino\n"
 +
    "  -s, --send=data              Send data to Arduino\n"
 +
    "  -r, --receive                Receive data from Arduino & print it out\n"
 +
    "  -n  --num=num                Send a number as a single byte\n"
 +
    "  -d  --delay=millis          Delay for specified milliseconds\n"
 +
    "\n"
 +
    "Note: Order is important. Set '-b' before doing '-p'. \n"
 +
    "      Used to make series of actions:  '-d 2000 -s hello -d 100 -r' \n"
 +
    "      means 'wait 2secs, send 'hello', wait 100msec, get reply'\n"
 +
    "\n");
 +
}
 +
 +
int main(int argc, char *argv[])
 +
{
 +
    int fd = 0;
 +
    char serialport[256];
 +
    int baudrate = B9600;  // default
 +
    char buf[256];
 +
    int rc,n;
 +
 +
    if (argc==1) {
 +
        usage();
 +
        exit(EXIT_SUCCESS);
 +
    }
 +
 +
    /* parse options */
 +
    int option_index = 0, opt;
 +
    static struct option loptions[] = {
 +
        {"help",      no_argument,      0, 'h'},
 +
        {"port",      required_argument, 0, 'p'},
 +
        {"baud",      required_argument, 0, 'b'},
 +
        {"send",      required_argument, 0, 's'},
 +
        {"receive",    no_argument,      0, 'r'},
 +
        {"num",        required_argument, 0, 'n'},
 +
        {"delay",      required_argument, 0, 'd'}
 +
    };
 +
   
 +
    while(1) {
 +
        opt = getopt_long (argc, argv, "hp:b:s:rn:d:",
 +
                          loptions, &option_index);
 +
        if (opt==-1) break;
 +
        switch (opt) {
 +
        case '0': break;
 +
        case 'd':
 +
            n = strtol(optarg,NULL,10);
 +
            usleep(n * 1000 ); // sleep milliseconds
 +
            break;
 +
        case 'h':
 +
            usage();
 +
            break;
 +
        case 'b':
 +
            baudrate = strtol(optarg,NULL,10);
 +
            break;
 +
        case 'p':
 +
            strcpy(serialport,optarg);
 +
            fd = serialport_init(optarg, baudrate);
 +
            if(fd==-1){
 +
      printf( "Could not initialize USB port\n\n" );
 +
      return -1;
 +
    }
 +
            break;
 +
        case 'n':
 +
            n = strtol(optarg, NULL, 10); // convert string to number
 +
            rc = serialport_writebyte(fd, (uint8_t)n);
 +
            if(rc==-1) return -1;
 +
            break;
 +
        case 's':
 +
            strcpy(buf,optarg);
 +
            rc = serialport_write(fd, buf);
 +
            if(rc==-1) return -1;
 +
            break;
 +
        case 'r':
 +
            serialport_read_until(fd, buf, '\n');
 +
            printf("read: %s\n",buf);
 +
            break;
 +
        }
 +
    }
 +
 +
    exit(EXIT_SUCCESS);   
 +
} // end main
 +
   
 +
int serialport_writebyte( int fd, uint8_t b)
 +
{
 +
    int n = write(fd,&b,1);
 +
    if( n!=1)
 +
        return -1;
 +
    return 0;
 +
}
 +
 +
int serialport_write(int fd, const char* str) {
 +
  int len;
 +
  char buff[1024];
 +
  strcpy( buff, str );
 +
  strcat( buff, "\n" );
 +
  len = strlen(buff);
 +
  int n = write(fd, buff, len);
 +
  if( n!=len )
 +
    return -1;
 +
  return 0;
 +
}
 +
 +
int serialport_read_until(int fd, char* buf, char until) {
 +
    char b[1];
 +
    int i=0, k;
 +
    do {
 +
        int n = read(fd, b, 1);  // read a char at a time
 +
        if( n==-1) {
 +
  usleep( 100*1000 );
 +
  continue;
 +
}
 +
        if( n==0 ) {
 +
            usleep( 10 * 1000 ); // wait 10 msec try again
 +
            continue;
 +
        }
 +
buf[i] = b[0];
 +
i++;
 +
    } while( b[0] != until );
 +
 +
    buf[i] = 0;  // null terminate the string
 +
    return 0;
 +
}
 +
 +
// takes the string name of the serial port (e.g. "/dev/tty.usbserial","COM1")
 +
// and a baud rate (bps) and connects to that port at that speed and 8N1.
 +
// opens the port in fully raw mode so you can send binary data.
 +
// returns valid fd, or -1 on error
 +
int serialport_init(const char* serialport, int baud)
 +
{
 +
    struct termios toptions;
 +
    int fd;
 +
   
 +
    //fprintf(stderr,"init_serialport: opening port %s @ %d bps\n",
 +
    //        serialport,baud);
 +
 +
    fd = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY);
 +
    if (fd == -1)  {
 +
        perror("init_serialport: Unable to open port ");
 +
        return -1;
 +
    }
 +
   
 +
    if (tcgetattr(fd, &toptions) < 0) {
 +
        perror("init_serialport: Couldn't get term attributes");
 +
        return -1;
 +
    }
 +
    speed_t brate = baud; // let you override switch below if needed
 +
    switch(baud) {
 +
    case 4800:  brate=B4800;  break;
 +
    case 9600:  brate=B9600;  break;
 +
#ifdef B14400
 +
    case 14400:  brate=B14400;  break;
 +
#endif
 +
    case 19200:  brate=B19200;  break;
 +
#ifdef B28800
 +
    case 28800:  brate=B28800;  break;
 +
#endif
 +
    case 38400:  brate=B38400;  break;
 +
    case 57600:  brate=B57600;  break;
 +
    case 115200: brate=B115200; break;
 +
    }
 +
    cfsetispeed(&toptions, brate);
 +
    cfsetospeed(&toptions, brate);
 +
 +
    // 8N1
 +
    toptions.c_cflag &= ~PARENB;
 +
    toptions.c_cflag &= ~CSTOPB;
 +
    toptions.c_cflag &= ~CSIZE;
 +
    toptions.c_cflag |= CS8;
 +
    // no flow control
 +
    toptions.c_cflag &= ~CRTSCTS;
 +
 +
    toptions.c_cflag |= CREAD | CLOCAL;  // turn on READ & ignore ctrl lines
 +
    toptions.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl
 +
 +
    toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw
 +
    toptions.c_oflag &= ~OPOST; // make raw
 +
 +
    // see: http://unixwiz.net/techtips/termios-vmin-vtime.html
 +
    toptions.c_cc[VMIN]  = 0;
 +
    toptions.c_cc[VTIME] = 20;
 +
   
 +
    if( tcsetattr(fd, TCSANOW, &toptions) < 0) {
 +
        perror("init_serialport: Couldn't set term attributes");
 +
        return -1;
 +
    }
 +
 +
    return fd;
 +
}
 +
 +
 +
 +
</pre></code>
 +
 +
=arduino-loop.pde
 +
 +
<code><pre>
 
char buffer[256];
 
char buffer[256];
 
int len;
 
int len;
Line 12: Line 262:
 
char *state;
 
char *state;
  
void setup();
 
void loop();
 
 
void resetAll();
 
void resetAll();
 
int process();
 
int process();
Line 19: Line 267:
 
int readPins( char mode );
 
int readPins( char mode );
  
int main() {
 
    setup();
 
    while (1) {
 
        loop();
 
    }
 
    return 0;
 
}
 
  
 
void setup() {
 
void setup() {
 +
    Serial.begin(9600);
 
     resetAll();
 
     resetAll();
 
}
 
}
Line 38: Line 280:
  
 
void loop() {
 
void loop() {
     char c= getchar();
+
     //if ( !Serial.available() )
     printf( " c='%c'", c );
+
    //  return;
 +
 
 +
    int c;
 +
    c = Serial.read();
 +
     if (c==-1) return;
 +
   
 
     if ( c=='\n' ) {
 
     if ( c=='\n' ) {
         if ( process() ) printf( "\n\nError!\n\n" );
+
         //if ( process() ) printf( "\n\nError!\n\n" );
 +
        if ( process() ) Serial.println( "Error\n" );
 
         resetAll();
 
         resetAll();
 
         return;
 
         return;
 
     }
 
     }
   
+
       
 
     buffer[ len++ ] = c;
 
     buffer[ len++ ] = c;
 
     buffer[ len ] = '\0';
 
     buffer[ len ] = '\0';
     printf( " len=%d buffer=[%s] ", len, buffer );
+
     //Serial.println( buffer );
 +
    //printf( " len=%d buffer=[%s] ", len, buffer );
 
}
 
}
  
Line 69: Line 318:
 
     int intState;
 
     int intState;
  
     printf( "\n\nProcessing buffer =[%s]\n\n", buffer );
+
     //printf( "\n\nProcessing buffer =[%s]\n\n", buffer );
 +
    Serial.print( "buffer = " );
 +
    Serial.print( buffer );
 
      
 
      
 
     if ( len < 3 ) {
 
     if ( len < 3 ) {
Line 84: Line 335:
 
     }
 
     }
  
     printf( "Operation = %c\n", *operation );
+
     //printf( "Operation = %c\n", *operation );
  
 
     mode = mystrtok( operation + 1, 0 );
 
     mode = mystrtok( operation + 1, 0 );
Line 92: Line 343:
 
     }
 
     }
  
     printf( "Mode = %c\n", *mode );
+
     //printf( "Mode = %c\n", *mode );
  
 
     if ( *operation == 'r' ) {
 
     if ( *operation == 'r' ) {
Line 131: Line 382:
 
int writePin( char mode, int  intPin, int intState ) {
 
int writePin( char mode, int  intPin, int intState ) {
 
     if ( mode=='d' )
 
     if ( mode=='d' )
         printf( "digitalWrite( %d, %d )\n", intPin, intState );
+
         //printf( "digitalWrite( %d, %d )\n", intPin, intState );
 +
        digitalWrite( intPin, intState );
 
     if ( mode=='a' )
 
     if ( mode=='a' )
         printf( "analogWrite( %d, %d )\n", intPin, intState );     
+
         //printf( "analogWrite( %d, %d )\n", intPin, intState );     
 +
        analogWrite( intPin, intState );
 
}
 
}
  
 
int readPins( char mode ) {
 
int readPins( char mode ) {
    int i;
+
  int i;
    if ( mode=='d' )
+
  if ( mode=='d' ) {
         for ( i=2; i<14; i++ )
+
        Serial.print( "d " );
             printf( "digitalRead(%d) ", i );
+
         for ( i=2; i<14; i++ ) {
    if ( mode=='a' )
+
             //printf( "digitalRead(%d) ", i );
         for ( i=0; i<6; i++ )
+
            Serial.print( digitalRead( i ) );
             printf( "analogRead(%d) ", i );
+
            Serial.print( ' ' );
 +
        }
 +
  }
 +
  if ( mode=='a' ) {
 +
        Serial.print( "a " );
 +
         for ( i=0; i<6; i++ ) {
 +
             //printf( "analogRead(%d) ", i );
 +
            Serial.print( analogRead( i ) );
 +
            Serial.print( ' ' );
 +
        }
 +
  }
 +
  Serial.println();
 +
  return 0;
 
}
 
}
 +
  
  
 
</pre></code>
 
</pre></code>

Revision as of 12:08, 1 November 2008

--D. Thiebaut 17:08, 1 November 2008 (UTC)

Status: could make arduino-serial.c program send commands and read from Arduino

arduino-serial.c


/*
 * Arduino-serial
 * --------------
 * 
 * A simple command-line example program showing how a computer can
 * communicate with an Arduino board. Works on any POSIX system (Mac/Unix/PC) 
 *
 *
 * Compile with something like:
 * gcc -o arduino-serial arduino-serial.c
 *
 * Created 5 December 2006
 * Copyleft (c) 2006, Tod E. Kurt, tod@todbot.com
 * http://todbot.com/blog/
 *
 * 
 * Updated 8 December 2006: 
 *  Justin McBride discoevered B14400 & B28800 aren't in Linux's termios.h.
 *  I've included his patch, but commented out for now.  One really needs a
 *  real make system when doing cross-platform C and I wanted to avoid that
 *  for this little program. Those baudrates aren't used much anyway. :)
 *
 * Updated 26 December 2007:
 *  Added ability to specify a delay (so you can wait for Arduino Diecimila)
 *  Added ability to send a binary byte number
 *
 * Update 31 August 2008:
 *  Added patch to clean up odd baudrates from Andy at hexapodia.org
 *
 */

#include <stdio.h>    /* Standard input/output definitions */
#include <stdlib.h> 
#include <stdint.h>   /* Standard types */
#include <string.h>   /* String function definitions */
#include <unistd.h>   /* UNIX standard function definitions */
#include <fcntl.h>    /* File control definitions */
#include <errno.h>    /* Error number definitions */
#include <termios.h>  /* POSIX terminal control definitions */
#include <sys/ioctl.h>
#include <getopt.h>

void usage(void);
int serialport_init(const char* serialport, int baud);
int serialport_writebyte(int fd, uint8_t b);
int serialport_write(int fd, const char* str);
int serialport_read_until(int fd, char* buf, char until);

void usage(void) {
    printf("Usage: arduino-serial -p <serialport> [OPTIONS]\n"
    "\n"
    "Options:\n"
    "  -h, --help                   Print this help message\n"
    "  -p, --port=serialport        Serial port Arduino is on\n"
    "  -b, --baud=baudrate          Baudrate (bps) of Arduino\n"
    "  -s, --send=data              Send data to Arduino\n"
    "  -r, --receive                Receive data from Arduino & print it out\n"
    "  -n  --num=num                Send a number as a single byte\n"
    "  -d  --delay=millis           Delay for specified milliseconds\n"
    "\n"
    "Note: Order is important. Set '-b' before doing '-p'. \n"
    "      Used to make series of actions:  '-d 2000 -s hello -d 100 -r' \n"
    "      means 'wait 2secs, send 'hello', wait 100msec, get reply'\n"
    "\n");
}

int main(int argc, char *argv[]) 
{
    int fd = 0;
    char serialport[256];
    int baudrate = B9600;  // default
    char buf[256];
    int rc,n;

    if (argc==1) {
        usage();
        exit(EXIT_SUCCESS);
    }

    /* parse options */
    int option_index = 0, opt;
    static struct option loptions[] = {
        {"help",       no_argument,       0, 'h'},
        {"port",       required_argument, 0, 'p'},
        {"baud",       required_argument, 0, 'b'},
        {"send",       required_argument, 0, 's'},
        {"receive",    no_argument,       0, 'r'},
        {"num",        required_argument, 0, 'n'},
        {"delay",      required_argument, 0, 'd'}
    };
    
    while(1) {
        opt = getopt_long (argc, argv, "hp:b:s:rn:d:",
                           loptions, &option_index);
        if (opt==-1) break;
        switch (opt) {
        case '0': break;
        case 'd':
            n = strtol(optarg,NULL,10);
            usleep(n * 1000 ); // sleep milliseconds
            break;
        case 'h':
            usage();
            break;
        case 'b':
            baudrate = strtol(optarg,NULL,10);
            break;
        case 'p':
            strcpy(serialport,optarg);
            fd = serialport_init(optarg, baudrate);
            if(fd==-1){
	      printf( "Could not initialize USB port\n\n" );
	      return -1;
	    }
            break;
        case 'n':
            n = strtol(optarg, NULL, 10); // convert string to number
            rc = serialport_writebyte(fd, (uint8_t)n);
            if(rc==-1) return -1;
            break;
        case 's':
            strcpy(buf,optarg);
            rc = serialport_write(fd, buf);
            if(rc==-1) return -1;
            break;
        case 'r':
            serialport_read_until(fd, buf, '\n');
            printf("read: %s\n",buf);
            break;
        }
    }

    exit(EXIT_SUCCESS);    
} // end main
    
int serialport_writebyte( int fd, uint8_t b)
{
    int n = write(fd,&b,1);
    if( n!=1)
        return -1;
    return 0;
}

int serialport_write(int fd, const char* str) {
  int len;
  char buff[1024];
  strcpy( buff, str );
  strcat( buff, "\n" );
  len = strlen(buff);
  int n = write(fd, buff, len);
  if( n!=len ) 
    return -1;
  return 0;
}

int serialport_read_until(int fd, char* buf, char until) {
    char b[1];
    int i=0, k;
    do { 
        int n = read(fd, b, 1);  // read a char at a time
        if( n==-1) {
	  usleep( 100*1000 );
	  continue;
	}
        if( n==0 ) {
            usleep( 10 * 1000 ); // wait 10 msec try again
            continue;
        }
	buf[i] = b[0];
	i++;
    } while( b[0] != until );

    buf[i] = 0;  // null terminate the string
    return 0;
}

// takes the string name of the serial port (e.g. "/dev/tty.usbserial","COM1")
// and a baud rate (bps) and connects to that port at that speed and 8N1.
// opens the port in fully raw mode so you can send binary data.
// returns valid fd, or -1 on error
int serialport_init(const char* serialport, int baud)
{
    struct termios toptions;
    int fd;
    
    //fprintf(stderr,"init_serialport: opening port %s @ %d bps\n",
    //        serialport,baud);

    fd = open(serialport, O_RDWR | O_NOCTTY | O_NDELAY);
    if (fd == -1)  {
        perror("init_serialport: Unable to open port ");
        return -1;
    }
    
    if (tcgetattr(fd, &toptions) < 0) {
        perror("init_serialport: Couldn't get term attributes");
        return -1;
    }
    speed_t brate = baud; // let you override switch below if needed
    switch(baud) {
    case 4800:   brate=B4800;   break;
    case 9600:   brate=B9600;   break;
#ifdef B14400
    case 14400:  brate=B14400;  break;
#endif
    case 19200:  brate=B19200;  break;
#ifdef B28800
    case 28800:  brate=B28800;  break;
#endif
    case 38400:  brate=B38400;  break;
    case 57600:  brate=B57600;  break;
    case 115200: brate=B115200; break;
    }
    cfsetispeed(&toptions, brate);
    cfsetospeed(&toptions, brate);

    // 8N1
    toptions.c_cflag &= ~PARENB;
    toptions.c_cflag &= ~CSTOPB;
    toptions.c_cflag &= ~CSIZE;
    toptions.c_cflag |= CS8;
    // no flow control
    toptions.c_cflag &= ~CRTSCTS;

    toptions.c_cflag |= CREAD | CLOCAL;  // turn on READ & ignore ctrl lines
    toptions.c_iflag &= ~(IXON | IXOFF | IXANY); // turn off s/w flow ctrl

    toptions.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // make raw
    toptions.c_oflag &= ~OPOST; // make raw

    // see: http://unixwiz.net/techtips/termios-vmin-vtime.html
    toptions.c_cc[VMIN]  = 0;
    toptions.c_cc[VTIME] = 20;
    
    if( tcsetattr(fd, TCSANOW, &toptions) < 0) {
        perror("init_serialport: Couldn't set term attributes");
        return -1;
    }

    return fd;
}



=arduino-loop.pde

char buffer[256];
int len;
char *operation;
char *mode;
char *pin;
char *state;

void resetAll();
int process();
int writePin( char mode, int pin, int state );
int readPins( char mode );


void setup() {
    Serial.begin(9600); 
    resetAll();
}

void resetAll() {
    buffer[0] = '\0';
    len       = 0;
    operation = mode = pin = state = 0;
}

void loop() {
    //if ( !Serial.available() )
    //  return;

    int c;
    c = Serial.read();
    if (c==-1) return;
    
    if ( c=='\n' ) {
        //if ( process() ) printf( "\n\nError!\n\n" );
        if ( process() ) Serial.println( "Error\n" );
        resetAll();
        return;
    }
         
    buffer[ len++ ] = c;
    buffer[ len ] = '\0';
    //Serial.println( buffer );
    //printf( " len=%d buffer=[%s] ", len, buffer );
}

char* mystrtok( char* p, int skipNonBlank ) {
    char* q=p;
    if ( skipNonBlank ) {
        for ( ; *q != ' ' && *q != '\0'; q++ );
        if ( *q=='\0' ) return NULL;
    }
    for ( ; *q != '\0' && *q==' '; q++ );
    if ( *q == '\0' ) return NULL;
    if ( *q == ' ' ) return NULL;
    return q;
}

int process() {
    char *p;
    int len = strlen( buffer );
    int intPin;
    int intState;

    //printf( "\n\nProcessing buffer =[%s]\n\n", buffer );
    Serial.print( "buffer = " );
    Serial.print( buffer );
    
    if ( len < 3 ) {
        resetAll();
        return 1; //error
    }

    operation = mystrtok( buffer, 0 );

    if ( ( !operation || (*operation!='r' && *operation!='w') ) 
         || ( ( *operation=='r' && len < 3 ) ||( *operation=='w' && len < 7 ) ) ) {
        resetAll();
        return 1; // error
    }

    //printf( "Operation = %c\n", *operation );

    mode = mystrtok( operation + 1, 0 );
    if (  !mode || ( *mode!='a' && *mode!='d' ) ) {
        resetAll();
        return 1; // success
    }

    //printf( "Mode = %c\n", *mode );

    if ( *operation == 'r' ) {
        readPins( *mode );
        resetAll();
        return 0; // success
    }


    pin = mystrtok( mode + 1, 0 );
    if ( !pin ) {
        resetAll();
        return 1; // error
    }
    intPin = atoi( pin );
    if ( intPin < 2 || intPin > 13 ) {
        resetAll();
        return 1; // error
    }
    
    state = mystrtok( pin+1, 1 );
    if ( !state ) {
        resetAll();
        return 1; // error 
    }
    intState = atoi( state );
    if ( intState < 0 || intState > 1 ) {
        resetAll();
        return 1;
    }
    
    writePin( *mode, intPin, intState );

    resetAll();
    return 0;
}

int writePin( char mode, int  intPin, int intState ) {
    if ( mode=='d' )
        //printf( "digitalWrite( %d, %d )\n", intPin, intState );
        digitalWrite( intPin, intState );
    if ( mode=='a' )
        //printf( "analogWrite( %d, %d )\n", intPin, intState );    
        analogWrite( intPin, intState );
}

int readPins( char mode ) {
  int i;
  if ( mode=='d' ) {
        Serial.print( "d " );
        for ( i=2; i<14; i++ ) {
            //printf( "digitalRead(%d) ", i );
            Serial.print( digitalRead( i ) );
            Serial.print( ' ' );
        }
  }
  if ( mode=='a' ) {
        Serial.print( "a " );
        for ( i=0; i<6; i++ ) {
            //printf( "analogRead(%d) ", i );
            Serial.print( analogRead( i ) );
            Serial.print( ' ' );
        }
  }
  Serial.println();
  return 0;
}