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
a6bf911f
Commit
a6bf911f
authored
Dec 10, 2011
by
maniacbug
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added example for Maple
parent
53cb5794
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
509 additions
and
0 deletions
+509
-0
examples/pingpair_maple/Jamfile
examples/pingpair_maple/Jamfile
+182
-0
examples/pingpair_maple/main.cpp
examples/pingpair_maple/main.cpp
+87
-0
examples/pingpair_maple/pingpair_maple.pde
examples/pingpair_maple/pingpair_maple.pde
+240
-0
No files found.
examples/pingpair_maple/Jamfile
0 → 100644
View file @
a6bf911f
MCU = cortex-m3 ;
CHIP = STM32F103ZE ;
BOARD = maple_native ;
#CHIP = at91sam3u4 ;
#BOARD = sam3u-ek ;
if ! $(TOOLSET)
{
TOOLSET = devkit ;
Echo "Assuming TOOLSET=devkit" ;
}
if $(TOOLSET) = yagarto
{
TOOLS_PATH = ~/Source/yagarto-4.6.2/bin ;
TOOLS_ARCH = arm-none-eabi- ;
}
if $(TOOLSET) = yagarto-install
{
TOOLS_PATH = ~/Source/yagarto/install/bin ;
TOOLS_ARCH = arm-none-eabi- ;
}
else if $(TOOLSET) = devkit
{
TOOLS_PATH = /opt/devkitARM/bin ;
TOOLS_ARCH = arm-eabi- ;
}
else if $(TOOLSET) = maple
{
TOOLS_PATH = /opt/Maple/Resources/Java/hardware/tools/arm/bin ;
TOOLS_ARCH = arm-none-eabi- ;
}
else if $(TOOLSET) = ports
{
TOOLS_PATH = /opt/local/bin ;
TOOLS_ARCH = arm-none-eabi- ;
}
CC = $(TOOLS_PATH)/$(TOOLS_ARCH)gcc ;
C++ = $(TOOLS_PATH)/$(TOOLS_ARCH)g++ ;
AS = $(TOOLS_PATH)/$(TOOLS_ARCH)gcc -c ;
LINK = $(TOOLS_PATH)/$(TOOLS_ARCH)g++ ;
OBJCOPY = $(TOOLS_PATH)/$(TOOLS_ARCH)objcopy ;
DFU = dfu-util ;
DEFINES += VECT_TAB_FLASH BOARD_$(BOARD) MCU_$(CHIP) ERROR_LED_PORT=GPIOC ERROR_LED_PIN=15 STM32_HIGH_DENSITY MAPLE_IDE ;
OPTIM = -Os ;
MFLAGS = cpu=$(MCU) thumb arch=armv7-m ;
CCFLAGS = -Wall -m$(MFLAGS) -g -nostdlib -ffunction-sections -fdata-sections -Wl,--gc-sections ;
C++FLAGS = $(CCFLAGS) -fno-rtti -fno-exceptions ;
LINKFLAGS += -m$(MFLAGS) -Xlinker --gc-sections ;
DFUFLAGS = -a1 -d 0x1eaf:0x0003 -R ;
MAPLE_DIR = $(HOME)/Source/SAM3U/libmaple ;
MAPLE_LIBS = Servo LiquidCrystal Wire FreeRTOS ;
MAPLE_SUBDIRS = wirish wirish/comm wirish/boards libmaple libmaple/usb libmaple/usb/usb_lib ;
SKETCH_DIR = $(HOME)/Source/Arduino ;
SKETCH_LIBS = RF24 ;
MODULE_DIRS = . $(MAPLE_DIR)/$(MAPLE_SUBDIRS) $(MAPLE_DIR)/libraries/$(MAPLE_LIBS) $(SKETCH_DIR)/libraries/$(SKETCH_LIBS) ;
HDRS = $(MODULE_DIRS) ;
LOCATE_TARGET = out/$(TOOLSET) ;
LOCATE_SOURCE = $(LOCATE_TARGET) ;
rule Pde
{
Depends $(<) : $(>) ;
MakeLocate $(<) : $(LOCATE_SOURCE) ;
Clean clean : $(<) ;
}
if ( $(ARDUINO_VERSION) < 100 )
{
ARDUINO_H = WProgram.h ;
}
else
{
ARDUINO_H = Arduino.h ;
}
actions Pde
{
echo "#include <$(ARDUINO_H)>" > $(<)
echo "#line 1 \"$(>)\"" >> $(<)
cat $(>) >> $(<)
}
rule C++Pde
{
local _CPP = $(>:B).cpp ;
Pde $(_CPP) : $(>) ;
C++ $(<) : $(_CPP) ;
}
rule Hex
{
Depends $(<) : $(>) ;
MakeLocate $(<) : $(LOCATE_TARGET) ;
Depends hex : $(<) ;
Clean clean : $(<) ;
}
actions Hex
{
$(OBJCOPY) -O ihex $(>) $(<)
}
rule Binary
{
Depends $(<) : $(>) ;
MakeLocate $(<) : $(LOCATE_TARGET) ;
Depends binary : $(<) ;
Clean clean : $(<) ;
}
actions Binary
{
$(OBJCOPY) -O binary $(>) $(<)
}
rule UserObject
{
switch $(>:S)
{
case .S : As $(<) : $(>) ;
case .ino : C++Pde $(<) : $(>) ;
case .pde : C++Pde $(<) : $(>) ;
}
}
rule Upload
{
Depends up : $(<) ;
NotFile up ;
Always $(<) ;
Always up ;
}
actions Upload
{
$(DFU) $(DFUFLAGS) -D $(<)
}
# Override base objects rule, so all output can go in the output dir
rule Objects
{
local _i ;
for _i in [ FGristFiles $(<) ]
{
local _b = $(_i:B)$(SUFOBJ) ;
local _o = $(_b:G=$(SOURCE_GRIST:E)) ;
Object $(_o) : $(_i) ;
Depends obj : $(_o) ;
}
}
# Override base main rule, so all output can go in the output dir
rule Main
{
MainFromObjects $(<) : $(>:B)$(SUFOBJ) ;
Objects $(>) ;
}
# Modules
MODULES = [ GLOB $(MODULE_DIRS) : *.pde *.c *.cpp *.S ] ;
# Main output executable
MAIN = $(PWD:B).elf ;
# Linker script
LINK_DIR = $(MAPLE_DIR)/support/ld ;
LINKSCRIPT = $(LINK_DIR)/$(BOARD)/flash.ld ;
# Bring in the map and link script
LINKFLAGS += -Wl,-Map=$(LOCATE_TARGET)/$(MAIN:B).map -T$(LINKSCRIPT) -L$(LINK_DIR) ;
Main $(MAIN) : $(MODULES) ;
Binary $(MAIN:B).bin : $(MAIN) ;
Upload $(MAIN:B).bin ;
examples/pingpair_maple/main.cpp
0 → 100644
View file @
a6bf911f
#ifdef MAPLE_IDE
#include <stdio.h>
#include "wirish.h"
extern
void
setup
(
void
);
extern
void
loop
(
void
);
void
board_start
(
const
char
*
program_name
)
{
// Set up the LED to steady on
pinMode
(
BOARD_LED_PIN
,
OUTPUT
);
digitalWrite
(
BOARD_LED_PIN
,
HIGH
);
// Setup the button as input
pinMode
(
BOARD_BUTTON_PIN
,
INPUT
);
digitalWrite
(
BOARD_BUTTON_PIN
,
HIGH
);
SerialUSB
.
begin
();
SerialUSB
.
println
(
"Press BUT"
);
// Wait for button press
while
(
!
isButtonPressed
()
)
{
}
SerialUSB
.
println
(
"Welcome!"
);
SerialUSB
.
println
(
program_name
);
int
i
=
11
;
while
(
i
--
)
{
toggleLED
();
delay
(
50
);
}
}
/**
* Custom version of _write, which will print to the USB.
* In order to use it you MUST ADD __attribute__((weak))
* to _write in libmaple/syscalls.c
*/
extern
"C"
int
_write
(
int
file
,
char
*
ptr
,
int
len
)
{
if
(
(
file
!=
1
)
&&
(
file
!=
2
)
)
return
0
;
else
SerialUSB
.
write
(
ptr
,
len
);
return
len
;
}
/**
* Re-entrant version of _write. Yagarto and Devkit now use
* the re-entrant newlib, so these get called instead of the
* non_r versions.
*/
extern
"C"
int
_write_r
(
void
*
,
int
file
,
char
*
ptr
,
int
len
)
{
return
_write
(
file
,
ptr
,
len
);
}
__attribute__
((
constructor
))
__attribute__
((
weak
))
void
premain
()
{
init
();
}
__attribute__
((
weak
))
void
setup
(
void
)
{
board_start
(
"No program defined"
);
}
__attribute__
((
weak
))
void
loop
(
void
)
{
}
__attribute__
((
weak
))
int
main
(
void
)
{
setup
();
while
(
true
)
{
loop
();
}
return
0
;
}
#endif // ifdef MAPLE_IDE
// vim:cin:ai:sts=2 sw=2 ft=cpp
examples/pingpair_maple/pingpair_maple.pde
0 → 100644
View file @
a6bf911f
/*
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.
*/
/**
* Example RF Radio Ping Pair ... for Maple
*
* This is an example of how to use the RF24 class. Write this sketch to two different nodes,
* connect the role_pin to ground on one. The ping node sends the current time to the pong node,
* which responds by sending the value back. The ping node can then see how long the whole cycle
* took.
*/
#include "WProgram.h"
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
//
// Maple specific setup. Other than this section, the sketch is the same on Maple as on
// Arduino
//
#ifdef MAPLE_IDE
// External startup function
extern
void
board_start
(
const
char
*
program_name
);
// Use SPI #2.
HardwareSPI
SPI
(
2
);
#else
#define board_startup printf
#define toggleLED(x) (x)
#endif
//
// Hardware configuration
//
// Set up nRF24L01 radio on SPI bus plus pins 8 & 9
RF24
radio
(
7
,
6
);
// 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
;
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
//
board_start
(
"
\n\r
RF24/examples/pingpair/
\n\r
"
);
printf
(
"ROLE: %s
\n\r
"
,
role_friendly_name
[
role
]);
//
// Setup and configure rf radio
//
radio
.
begin
();
// optionally, increase the delay between retries & # of retries
radio
.
setRetries
(
15
,
15
);
// optionally, reduce the payload size. seems to
// improve reliability
radio
.
setPayloadSize
(
8
);
//
// 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
)
{
toggleLED
();
// 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
);
bool
ok
=
radio
.
write
(
&
time
,
sizeof
(
unsigned
long
)
);
if
(
ok
)
printf
(
"ok...
\r\n
"
);
else
printf
(
"failed.
\r\n
"
);
// 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.
\r\n
"
);
}
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
\r\n
"
,
got_time
,
millis
()
-
got_time
);
}
toggleLED
();
// Try again 1s later
delay
(
1000
);
}
//
// 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.
\r\n
"
);
// Now, resume listening so we catch the next packets.
radio
.
startListening
();
}
}
}
// vim:cin:ai:sts=2 sw=2 ft=cpp
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