Difference between revisions of "Arduino loop"
(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 resetAll(); | void resetAll(); | ||
int process(); | int process(); | ||
Line 19: | Line 267: | ||
int readPins( char mode ); | int readPins( char mode ); | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
void setup() { | void setup() { | ||
+ | Serial.begin(9600); | ||
resetAll(); | resetAll(); | ||
} | } | ||
Line 38: | Line 280: | ||
void loop() { | void loop() { | ||
− | + | //if ( !Serial.available() ) | |
− | + | // 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; | |
− | + | if ( mode=='d' ) { | |
− | for ( i=2; i<14; i++ ) | + | Serial.print( "d " ); |
− | printf( "digitalRead(%d) ", i ); | + | for ( i=2; i<14; i++ ) { |
− | + | //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;
}