Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
R
RF24
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Commits
Open sidebar
xpstem
RF24
Commits
3aab74ae
Commit
3aab74ae
authored
Aug 02, 2011
by
maniacbug
Browse files
Options
Browse Files
Download
Plain Diff
Merge master with static payload fixes
parents
2f33bdbe
39ca6b95
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
579 additions
and
34 deletions
+579
-34
.gitignore
.gitignore
+1
-0
RF24.cpp
RF24.cpp
+21
-23
RF24.h
RF24.h
+2
-1
tests/pingpair_blocking/Jamfile
tests/pingpair_blocking/Jamfile
+206
-0
tests/pingpair_blocking/pingpair_blocking.pde
tests/pingpair_blocking/pingpair_blocking.pde
+270
-0
tests/pingpair_blocking/printf.h
tests/pingpair_blocking/printf.h
+33
-0
tests/pingpair_blocking/runtest.py
tests/pingpair_blocking/runtest.py
+25
-0
tests/pingpair_blocking/runtests.sh
tests/pingpair_blocking/runtests.sh
+9
-0
tests/pingpair_test/pingpair_test.pde
tests/pingpair_test/pingpair_test.pde
+7
-5
tests/pingpair_test/runtests.sh
tests/pingpair_test/runtests.sh
+5
-5
No files found.
.gitignore
View file @
3aab74ae
...
...
@@ -2,6 +2,7 @@
*.o
.*.swp
*.orig
.swp
docs/
output/
ojam/
...
...
RF24.cpp
View file @
3aab74ae
...
...
@@ -109,20 +109,17 @@ uint8_t RF24::write_payload(const void* buf, uint8_t len)
const
uint8_t
*
current
=
reinterpret_cast
<
const
uint8_t
*>
(
buf
);
uint8_t
data_len
=
min
(
len
,
payload_size
);
uint8_t
blank_len
=
dynamic_payloads_enabled
?
0
:
payload_size
-
data_len
;
//printf("[Writing %u bytes %u blanks]",data_len,blank_len);
csn
(
LOW
);
status
=
SPI
.
transfer
(
W_TX_PAYLOAD
);
uint8_t
data_len
=
min
(
len
,
payload_size
);
while
(
data_len
--
)
SPI
.
transfer
(
*
current
++
);
// This does not seem to be needed. Keeping it here in case
// removing it does cause problems for static payloads
//
// Send blanks out to the chip to finish off the payload
//uint8_t blank_len = payload_size - data_len;
//while ( blank_len-- )
// SPI.transfer(0);
while
(
blank_len
--
)
SPI
.
transfer
(
0
);
csn
(
HIGH
);
return
status
;
...
...
@@ -135,21 +132,17 @@ uint8_t RF24::read_payload(void* buf, uint8_t len)
uint8_t
status
;
uint8_t
*
current
=
reinterpret_cast
<
uint8_t
*>
(
buf
);
uint8_t
data_len
=
min
(
len
,
payload_size
);
uint8_t
blank_len
=
dynamic_payloads_enabled
?
0
:
payload_size
-
data_len
;
//printf("[Reading %u bytes %u blanks]",data_len,blank_len);
csn
(
LOW
);
status
=
SPI
.
transfer
(
R_RX_PAYLOAD
);
uint8_t
data_len
=
min
(
len
,
payload_size
);
while
(
data_len
--
)
*
current
++
=
SPI
.
transfer
(
0xff
);
// This does not seem to be needed. Keeping it here in case
// removing it does cause problems for static payloads
//
// Read the remaining payload off the chip, even though we will
// throw it away.
//uint8_t blank_len = payload_size - data_len;
//while ( blank_len-- )
// SPI.transfer(0xff);
while
(
blank_len
--
)
SPI
.
transfer
(
0xff
);
csn
(
HIGH
);
return
status
;
...
...
@@ -254,8 +247,8 @@ void RF24::print_address_register(prog_char* name, uint8_t reg, uint8_t qty)
/****************************************************************************/
RF24
::
RF24
(
uint8_t
_cepin
,
uint8_t
_cspin
)
:
ce_pin
(
_cepin
),
csn_pin
(
_cspin
),
wide_band
(
true
),
p_variant
(
false
),
payload_size
(
32
),
ack_payload_available
(
false
)
ce_pin
(
_cepin
),
csn_pin
(
_cspin
),
wide_band
(
true
),
p_variant
(
false
),
payload_size
(
32
),
ack_payload_available
(
false
),
dynamic_payloads_enabled
(
false
)
{
}
...
...
@@ -363,6 +356,9 @@ void RF24::begin(void)
// Initialize CRC and request 2-byte (16bit) CRC
setCRCLength
(
RF24_CRC_16
)
;
// Disable dynamic payloads, to match dynamic_payloads_enabled setting
write_register
(
DYNPD
,
0
);
// Reset current status
// Notice reset and flush is the last thing we do
...
...
@@ -664,6 +660,8 @@ void RF24::enableDynamicPayloads(void)
// Not sure the use case of only having dynamic payload on certain
// pipes, so the library does not support it.
write_register
(
DYNPD
,
read_register
(
DYNPD
)
|
_BV
(
DPL_P5
)
|
_BV
(
DPL_P4
)
|
_BV
(
DPL_P3
)
|
_BV
(
DPL_P2
)
|
_BV
(
DPL_P1
)
|
_BV
(
DPL_P0
));
dynamic_payloads_enabled
=
true
;
}
/****************************************************************************/
...
...
RF24.h
View file @
3aab74ae
...
...
@@ -29,7 +29,8 @@ private:
bool
p_variant
;
/* False for RF24L01 and true for RF24L01P */
uint8_t
payload_size
;
/**< Fixed size of payloads */
bool
ack_payload_available
;
/**< Whether there is an ack payload waiting */
uint8_t
ack_payload_length
;
/**< Dynamic size of pending ack payload. Note: not used. */
bool
dynamic_payloads_enabled
;
/**< Whether dynamic payloads are enabled. */
uint8_t
ack_payload_length
;
/**< Dynamic size of pending ack payload. */
uint64_t
pipe0_reading_address
;
/**< Last address set on pipe 0 for reading. */
protected:
...
...
tests/pingpair_blocking/Jamfile
0 → 100644
View file @
3aab74ae
PROJECT_NAME = $(PWD:B) ;
PROJECT_DIR = . ;
PROJECT_LIBS = SPI RF24 ;
OUT_DIR = ojam ;
F_CPU = 16000000 ;
MCU = atmega328p ;
PORTS = /dev/tty.usbserial-A600eHIs /dev/tty.usbserial-A40081RP /dev/tty.usbserial-A9007LmI ;
UPLOAD_RATE = 57600 ;
AVRDUDE_PROTOCOL = stk500v1 ;
COM = 33 ;
# Host-specific overrides for locations
if $(OS) = MACOSX
{
ARDUINO_VERSION = 22 ;
OLD_DIR = /opt/arduino-0021 ;
AVR_TOOLS_PATH = $(OLD_DIR)/hardware/tools/avr/bin ;
AVRDUDECONFIG_PATH = $(OLD_DIR)/hardware/tools/avr/etc ;
ARDUINO_DIR = /opt/Arduino ;
ARDUINO_AVR = /usr/lib/avr/include ;
}
# Where is everything?
ARDUINO_VERSION ?= 22 ;
AVR_TOOLS_PATH ?= /usr/bin ;
ARDUINO_DIR ?= /opt/arduino-00$(ARDUINO_VERSION) ;
ARDUINO_AVR ?= $(ARDUINO_DIR)/hardware/tools/avr/avr/include/avr ;
AVRDUDECONFIG_PATH ?= $(ARDUINO_DIR)/hardware/tools ;
ARDUINO_CORE = $(ARDUINO_DIR)/hardware/arduino/cores/arduino ;
ARDUINO_LIB = $(ARDUINO_DIR)/libraries ;
SKETCH_LIB = $(HOME)/Source/Arduino/libraries ;
AVR_CC = $(AVR_TOOLS_PATH)/avr-gcc ;
AVR_CXX = $(AVR_TOOLS_PATH)/avr-g++ ;
AVR_LD = $(AVR_TOOLS_PATH)/avr-gcc ;
AVR_OBJCOPY = $(AVR_TOOLS_PATH)/avr-objcopy ;
AVRDUDE = $(AVR_TOOLS_PATH)/avrdude ;
DEFINES = F_CPU=$(F_CPU)L ARDUINO=$(ARDUINO_VERSION) VERSION_H ;
CTUNING = -ffunction-sections -fdata-sections ;
CXXTUNING = -fno-exceptions -fno-strict-aliasing ;
CFLAGS = -Os -Werror -Wall -Wextra -mmcu=$(MCU) $(CTUNING) ;
CXXFLAGS = $(CFLAGS) $(CXXTUNING) ;
LDFLAGS = -Os -lm -Wl,--gc-sections -mmcu=atmega328p ;
# Search everywhere for headers
HDRS = $(PROJECT_DIR) $(ARDUINO_AVR) $(ARDUINO_CORE) [ GLOB $(ARDUINO_LIB) $(SKETCH_LIB) : [^.]* ] ;
# Grab everything from the core directory
CORE_MODULES = [ GLOB $(ARDUINO_CORE) : *.c *.cpp ] ;
# Grab everything from libraries. To avoid this "grab everything" behaviour, you
# can specify specific modules to pick up in PROJECT_MODULES
LIB_MODULES = [ GLOB $(ARDUINO_LIB)/$(PROJECT_LIBS) $(SKETCH_LIB)/$(PROJECT_LIBS) : *.cpp ] ;
# In addition to explicitly-specified program modules, pick up anything from the current
# dir.
PROJECT_MODULES += [ GLOB $(PROJECT_DIR) : *.c *.cpp *.pde ] ;
# Shortcut for the out files
OUT = $(OUT_DIR)/$(PROJECT_NAME) ;
# AvrDude setup
AVRDUDE_FLAGS = -V -F -D -C $(AVRDUDECONFIG_PATH)/avrdude.conf -p $(MCU) -c $(AVRDUDE_PROTOCOL) -b $(UPLOAD_RATE) ;
rule GitVersion
{
Always $(<) ;
Depends all : $(<) ;
}
actions GitVersion
{
echo "const char program_version[] = \"\\" > $(<)
git log -1 --pretty=format:%h >> $(<)
echo "\";" >> $(<)
}
GitVersion version.h ;
rule AvrCc
{
Depends $(<) : $(>) ;
Depends $(<) : $(<:D) ;
Clean clean : $(<) ;
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ] ;
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
}
actions AvrCc
{
$(AVR_CC) -c -o $(<) $(CCHDRS) $(CCDEFS) $(CFLAGS) $(>)
}
rule AvrC++
{
Depends $(<) : $(>) ;
Depends $(<) : $(<:D) ;
Clean clean : $(<) ;
CCHDRS on $(<) = [ on $(<) FIncludes $(HDRS) ] ;
CCDEFS on $(<) = [ on $(<) FDefines $(DEFINES) ] ;
}
actions AvrC++
{
$(AVR_CXX) -c -o $(<) $(CCHDRS) $(CCDEFS) $(CXXFLAGS) $(>)
}
rule Pde
{
Depends $(<) : $(>) ;
Depends $(<) : $(<:D) ;
Clean clean : $(<) ;
}
actions Pde
{
echo "#include <WProgram.h>" > $(<)
echo "#line 1 \"$(>)\"" >> $(<)
cat $(>) >> $(<)
}
rule AvrPde
{
local _CPP = $(OUT_DIR)/$(_I:B).cpp ;
Pde $(_CPP) : $(>) ;
AvrC++ $(<) : $(_CPP) ;
}
rule AvrObject
{
switch $(>:S)
{
case .c : AvrCc $(<) : $(>) ;
case .cpp : AvrC++ $(<) : $(>) ;
case .pde : AvrPde $(<) : $(>) ;
}
}
rule AvrObjects
{
for _I in $(<)
{
AvrObject $(OUT_DIR)/$(_I:B).o : $(_I) ;
}
}
rule AvrMainFromObjects
{
Depends $(<) : $(>) ;
Depends $(<) : $(<:D) ;
MkDir $(<:D) ;
Depends all : $(<) ;
Clean clean : $(<) ;
}
actions AvrMainFromObjects
{
$(AVR_LD) $(LDFLAGS) -o $(<) $(>)
}
rule AvrMain
{
AvrMainFromObjects $(<) : $(OUT_DIR)/$(>:B).o ;
AvrObjects $(>) ;
}
rule AvrHex
{
Depends $(<) : $(>) ;
Depends $(<) : $(<:D) ;
Depends hex : $(<) ;
Clean clean : $(<) ;
}
actions AvrHex
{
$(AVR_OBJCOPY) -O ihex -R .eeprom $(>) $(<)
}
rule AvrUpload
{
Depends $(1) : $(2) ;
Depends $(2) : $(3) ;
NotFile $(1) ;
Always $(1) ;
Always $(2) ;
AvrUploadAction $(2) : $(3) ;
}
actions AvrUploadAction
{
$(AVRDUDE) $(AVRDUDE_FLAGS) -P $(<) $(AVRDUDE_WRITE_FLASH) -U flash:w:$(>):i
}
AvrMain $(OUT).elf : $(CORE_MODULES) $(LIB_MODULES) $(PROJECT_MODULES) ;
AvrHex $(OUT).hex : $(OUT).elf ;
AvrUpload p6 : /dev/tty.usbserial-A600eHIs : $(OUT).hex ;
AvrUpload p4 : /dev/tty.usbserial-A40081RP : $(OUT).hex ;
AvrUpload p9 : /dev/tty.usbserial-A9007LmI : $(OUT).hex ;
tests/pingpair_blocking/pingpair_blocking.pde
0 → 100644
View file @
3aab74ae
/*
Copyright (C) 2011 James Coliz, Jr. <maniacbug@ymail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
*/
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include "printf.h"
//
// Test version of RF24, exposes some protected interface
//
class
RF24Test
:
public
RF24
{
public:
RF24Test
(
int
a
,
int
b
)
:
RF24
(
a
,
b
)
{}
};
//
// Hardware configuration
//
// Set up nRF24L01 radio on SPI bus plus pins 8 & 9
RF24Test
radio
(
8
,
9
);
// sets the role of this unit in hardware. Connect to GND to be the 'pong' receiver
// Leave open to be the 'ping' transmitter
const
int
role_pin
=
7
;
//
// Topology
//
// Radio pipe addresses for the 2 nodes to communicate.
const
uint64_t
pipes
[
2
]
=
{
0xF0F0F0F0E1LL
,
0xF0F0F0F0D2LL
};
//
// Role management
//
// Set up role. This sketch uses the same software for all the nodes
// in this system. Doing so greatly simplifies testing. The hardware itself specifies
// which node it is.
//
// This is done through the role_pin
//
// The various roles supported by this sketch
typedef
enum
{
role_ping_out
=
1
,
role_pong_back
}
role_e
;
// The debug-friendly names of those roles
const
char
*
role_friendly_name
[]
=
{
"invalid"
,
"Ping out"
,
"Pong back"
};
// The role of the current running sketch
role_e
role
;
//
// Test state
//
bool
done
;
//*< Are we done with the test? */
bool
passed
;
//*< Have we passed the test? */
bool
notified
;
//*< Have we notified the user we're done? */
const
int
num_needed
=
10
;
//*< How many success/failures until we're done? */
int
receives_remaining
=
num_needed
;
//*< How many ack packets until we declare victory? */
int
failures_remaining
=
num_needed
;
//*< How many more failed sends until we declare failure? */
const
int
interval
=
100
;
//*< ms to wait between sends */
char
configuration
=
'1'
;
//*< Configuration key, one char sent in by the test framework to tell us how to configure, this is the default */
void
one_ok
(
void
)
{
// Have we received enough yet?
if
(
!
--
receives_remaining
)
{
done
=
true
;
passed
=
true
;
}
}
void
one_failed
(
void
)
{
// Have we failed enough yet?
if
(
!
--
failures_remaining
)
{
done
=
true
;
passed
=
false
;
}
}
void
setup
(
void
)
{
//
// Role
//
// set up the role pin
pinMode
(
role_pin
,
INPUT
);
digitalWrite
(
role_pin
,
HIGH
);
delay
(
20
);
// Just to get a solid reading on the role pin
// read the address pin, establish our role
if
(
digitalRead
(
role_pin
)
)
role
=
role_ping_out
;
else
role
=
role_pong_back
;
//
// Print preamble
//
Serial
.
begin
(
57600
);
printf_begin
();
printf
(
"
\n\r
RF24/tests/pingpair_blocking/
\n\r
"
);
printf
(
"ROLE: %s
\n\r
"
,
role_friendly_name
[
role
]);
//
// get test config
//
printf
(
"+READY press any key to start
\n\r\n\r
"
);
while
(
!
Serial
.
available
()
)
{}
configuration
=
Serial
.
read
();
printf
(
"Configuration
\t
= %c
\n\r
"
,
configuration
);
//
// Setup and configure rf radio
//
radio
.
begin
();
//
// Open pipes to other nodes for communication
//
// This simple sketch opens two pipes for these two nodes to communicate
// back and forth.
// Open 'our' pipe for writing
// Open the 'other' pipe for reading, in position #1 (we can have up to 5 pipes open for reading)
if
(
role
==
role_ping_out
)
{
radio
.
openWritingPipe
(
pipes
[
0
]);
radio
.
openReadingPipe
(
1
,
pipes
[
1
]);
}
else
{
radio
.
openWritingPipe
(
pipes
[
1
]);
radio
.
openReadingPipe
(
1
,
pipes
[
0
]);
}
//
// Start listening
//
radio
.
startListening
();
//
// Dump the configuration of the rf unit for debugging
//
radio
.
printDetails
();
}
void
loop
(
void
)
{
//
// Ping out role. Repeatedly send the current time
//
if
(
role
==
role_ping_out
)
{
// First, stop listening so we can talk.
radio
.
stopListening
();
// Take the time, and send it. This will block until complete
unsigned
long
time
=
millis
();
printf
(
"Now sending %lu..."
,
time
);
radio
.
write
(
&
time
,
sizeof
(
unsigned
long
)
);
// Now, continue listening
radio
.
startListening
();
// Wait here until we get a response, or timeout (250ms)
unsigned
long
started_waiting_at
=
millis
();
bool
timeout
=
false
;
while
(
!
radio
.
available
()
&&
!
timeout
)
if
(
millis
()
-
started_waiting_at
>
200
)
timeout
=
true
;
// Describe the results
if
(
timeout
)
{
printf
(
"Failed, response timed out.
\n\r
"
);
one_failed
();
}
else
{
// Grab the response, compare, and send to debugging spew
unsigned
long
got_time
;
radio
.
read
(
&
got_time
,
sizeof
(
unsigned
long
)
);
// Spew it
printf
(
"Got response %lu, round-trip delay: %lu
\n\r
"
,
got_time
,
millis
()
-
got_time
);
one_ok
();
}
// Try again later
delay
(
250
);
}
//
// Pong back role. Receive each packet, dump it out, and send it back
//
if
(
role
==
role_pong_back
)
{
// if there is data ready
if
(
radio
.
available
()
)
{
// Dump the payloads until we've gotten everything
unsigned
long
got_time
;
bool
done
=
false
;
while
(
!
done
)
{
// Fetch the payload, and see if this was the last one.
done
=
radio
.
read
(
&
got_time
,
sizeof
(
unsigned
long
)
);
// Spew it
printf
(
"Got payload %lu..."
,
got_time
);
// Delay just a little bit to let the other unit
// make the transition to receiver
delay
(
20
);
}
// First, stop listening so we can talk
radio
.
stopListening
();
// Send the final one back.
radio
.
write
(
&
got_time
,
sizeof
(
unsigned
long
)
);
printf
(
"Sent response.
\n\r
"
);
// Now, resume listening so we catch the next packets.
radio
.
startListening
();
}
}
//
// Stop the test if we're done and report results
//
if
(
done
&&
!
notified
)
{
notified
=
true
;
printf
(
"
\n\r
+OK "
);
if
(
passed
)
printf
(
"PASS
\n\r\n\r
"
);
else
printf
(
"FAIL
\n\r\n\r
"
);
}
}
// vim:cin:ai:sts=2 sw=2 ft=cpp
tests/pingpair_blocking/printf.h
0 → 100644
View file @
3aab74ae
/*
Copyright (C) 2011 James Coliz, Jr. <maniacbug@ymail.com>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
version 2 as published by the Free Software Foundation.
*/
/**
* @file printf.h
*
* Setup necessary to direct stdout to the Arduino Serial library, which
* enables 'printf'
*/
#ifndef __PRINTF_H__
#define __PRINTF_H__
#include "WProgram.h"
int
serial_putc
(
char
c
,
FILE
*
)
{
Serial
.
write
(
c
);
return
c
;
}
void
printf_begin
(
void
)
{
fdevopen
(
&
serial_putc
,
0
);
}
#endif // __PRINTF_H__
tests/pingpair_blocking/runtest.py
0 → 100755
View file @
3aab74ae
#!/opt/local/bin/python
import
sys
,
serial
def
read_until
(
token
):
while
1
:
line
=
ser
.
readline
(
None
,
"
\r
"
)
sys
.
stdout
.
write
(
line
)
if
(
line
.
startswith
(
token
)):
break
return
line
ser
=
serial
.
Serial
(
sys
.
argv
[
1
],
57600
,
timeout
=
5
,
dsrdtr
=
False
,
rtscts
=
False
)
read_until
(
"+READY"
)
ser
.
write
(
sys
.
argv
[
2
])
line
=
read_until
(
"+OK"
)
ser
.
close
()
if
(
line
.
find
(
"PASS"
)
!=
-
1
):
sys
.
exit
(
0
)
else
:
sys
.
exit
(
1
)
tests/pingpair_blocking/runtests.sh
0 → 100755
View file @
3aab74ae
#!/bin/sh
# Connect p6 to receiver, p4 to sender
jam p4 p6
||
exit
1
./runtest.py /dev/tty.usbserial-A600eHIs 1 &
./runtest.py /dev/tty.usbserial-A40081RP 1
||
(
kill
`
jobs
-p
`
&&
exit
1
)
kill
`
jobs
-p
`
exit
0
tests/pingpair_test/pingpair_test.pde
View file @
3aab74ae
...
...
@@ -193,9 +193,9 @@ void setup(void)
// Config 3 is static payloads only
if
(
configuration
==
'3'
)
{
next_payload_size
=
max_payload_size
;
next_payload_size
=
16
;
payload_size_increments_by
=
0
;
radio
.
setPayloadSize
(
16
);
radio
.
setPayloadSize
(
next_payload_size
);
}
else
{
...
...
@@ -351,6 +351,7 @@ void check_radio(void)
printf
(
"FAILED "
);
one_failed
();
}
last_message_count
=
message_count
;
}
// If we're the receiver, we've received a time message
...
...
@@ -360,7 +361,9 @@ void check_radio(void)
size_t
len
=
max_payload_size
;
memset
(
receive_payload
,
0
,
max_payload_size
);
if
(
configuration
!=
'3'
)
if
(
configuration
==
'3'
)
len
=
next_payload_size
;
else
len
=
radio
.
getDynamicPayloadSize
();
radio
.
read
(
receive_payload
,
len
);
...
...
@@ -369,8 +372,7 @@ void check_radio(void)
receive_payload
[
len
]
=
0
;
// Spew it
len
=
strlen
(
receive_payload
);
// How much did we REALLY get?
printf
(
"Got payload size=%i value=%s
\n\r
"
,
len
,
receive_payload
);
printf
(
"Got payload size=%i value=%s strlen=%u
\n\r
"
,
len
,
receive_payload
,
strlen
(
receive_payload
));
// Add an ack packet for the next time around.
// Here we will report back how many bytes we got this time.
...
...
tests/pingpair_test/runtests.sh
View file @
3aab74ae
...
...
@@ -4,13 +4,13 @@
# WARNING: Test config 2 only works with PLUS units.
jam p4 p6
||
exit
1
./runtest.py /dev/tty.usbserial-A600eHIs 3 &
./runtest.py /dev/tty.usbserial-A40081RP 3
||
exit
1
kill
`
jobs
-p
`
./runtest.py /dev/tty.usbserial-A600eHIs 1 &
./runtest.py /dev/tty.usbserial-A40081RP 1
||
exit
1
./runtest.py /dev/tty.usbserial-A40081RP 1
||
(
kill
`
jobs
-p
`
&&
exit
1
)
kill
`
jobs
-p
`
./runtest.py /dev/tty.usbserial-A600eHIs 2 &
./runtest.py /dev/tty.usbserial-A40081RP 2
||
exit
1
./runtest.py /dev/tty.usbserial-A40081RP 2
||
(
kill
`
jobs
-p
`
&&
exit
1
)
kill
`
jobs
-p
`
./runtest.py /dev/tty.usbserial-A600eHIs 3 &
./runtest.py /dev/tty.usbserial-A40081RP 3
||
(
kill
`
jobs
-p
`
&&
exit
1
)
kill
`
jobs
-p
`
exit
0
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment