Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
P
Promethevs_systemprogramming
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
pcc2023_03
Promethevs_systemprogramming
Commits
02bdf143
Commit
02bdf143
authored
2 years ago
by
서상원
Browse files
Options
Downloads
Patches
Plain Diff
Upload New File
parent
12143b75
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
Rasp3.cpp
+177
-0
177 additions, 0 deletions
Rasp3.cpp
with
177 additions
and
0 deletions
Rasp3.cpp
0 → 100644
+
177
−
0
View file @
02bdf143
/*
* See documentation at https://nRF24.github.io/RF24
* See License information at root directory of this library
* Author: Brendan Doherty (2bndy5)
*/
/**
* A simple example of sending data from 1 nRF24L01 transceiver to another.
*
* This example was written to be used on 2 devices acting as "nodes".
* Use `ctrl+c` to quit at any time.
*/
#include
<ctime>
// time()
#include
<iostream>
// cin, cout, endl
#include
<string>
// string, getline()
#include
<time.h>
// CLOCK_MONOTONIC_RAW, timespec, clock_gettime()
#include
<RF24/RF24.h>
// RF24, RF24_PA_LOW, delay()
using
namespace
std
;
/****************** Linux ***********************/
// Radio CE Pin, CSN Pin, SPI Speed
// CE Pin uses GPIO number with BCM and SPIDEV drivers, other platforms use their own pin numbering
// CS Pin addresses the SPI bus number at /dev/spidev<a>.<b>
// ie: RF24 radio(<ce_pin>, <a>*10+<b>); spidev1.0 is 10, spidev1.1 is 11 etc..
#define CSN_PIN 0
#ifdef MRAA
#define CE_PIN 15 // GPIO22
#else
#define CE_PIN 22
#endif
// Generic:
RF24
radio
(
CE_PIN
,
CSN_PIN
);
/****************** Linux (BBB,x86,etc) ***********************/
// See http://nRF24.github.io/RF24/pages.html for more information on usage
// See http://iotdk.intel.com/docs/master/mraa/ for more information on MRAA
// See https://www.kernel.org/doc/Documentation/spi/spidev for more information on SPIDEV
float
payload
=
-
1
;
//
void
setRole
();
// set the node's role
void
master
();
// TX node's behavior
void
slave
();
// RX node's behavior
// custom defined timer for evaluating transmission time in microseconds
struct
timespec
startTimer
,
endTimer
;
uint32_t
getMicros
();
// prototype to get elapsed time in microseconds
int
main
(
int
argc
,
char
**
argv
)
{
// perform hardware check
if
(
!
radio
.
begin
())
{
cout
<<
"radio hardware is not responding!!"
<<
endl
;
return
0
;
// quit now
}
// A variable to uniquely identify which address this radio will use to transmit and receive
bool
radioNumber
=
1
;
// 0 uses address[0] to transmit, 1 uses address[1] to transmit and the other one uses to receive
// print program's name
cout
<<
argv
[
0
]
<<
endl
;
// Let these addresses be used for the pair
uint8_t
address
[
2
][
6
]
=
{
"LIFT1"
,
"SPEAK"
};
// Set the radioNumber via the terminal on startup. It will change the transmit direction. 1 for LIFT to BUS, 0 for BUS to LIFT
string
input
;
input
.
assign
(
argv
[
1
]);
radioNumber
=
input
.
length
()
>
0
&&
(
uint8_t
)
input
[
0
]
==
49
;
// save on transmission time by setting the radio to only transmit the
// number of bytes we need to transmit a float
radio
.
setPayloadSize
(
sizeof
(
payload
));
// float datatype occupies 4 bytes
// Set the PA Level low to try preventing power supply related problems
// because these examples are likely run with nodes in close proximity to
// each other.
radio
.
setPALevel
(
RF24_PA_LOW
);
// RF24_PA_MAX is default.
radio
.
openWritingPipe
(
address
[
radioNumber
]);
// using pipe 0
radio
.
openReadingPipe
(
1
,
address
[
!
radioNumber
]);
// using pipe 1
// For debugging info
// radio.printDetails(); // (smaller) function that prints raw register values
// radio.printPrettyDetails(); // (larger) function that prints human readable data
// ready to execute program now
setRole
();
// calls master() and slave() one after another
return
0
;
}
/**
* Role of this program will pingpong.
*/
void
setRole
()
{
while
(
1
){
master
();
slave
();
}
}
// setRole()
/**
* make this node act as the transmitter
*/
void
master
()
{
radio
.
stopListening
();
// put radio in TX mode
cout
<<
"Start TX role."
<<
endl
;
unsigned
int
mcount
=
0
;
// keep track of master time
while
(
mcount
<
2
&&
payload
!=
1
)
{
// if not received any values since last transmit no transmition
clock_gettime
(
CLOCK_MONOTONIC_RAW
,
&
startTimer
);
// start the timer
bool
report
=
radio
.
write
(
&
payload
,
sizeof
(
float
));
// transmit & save the report
uint32_t
timerElapsed
=
getMicros
();
// end the timer
if
(
report
)
{
// payload was delivered
cout
<<
"Transmission successful! Time to transmit = "
;
cout
<<
timerElapsed
;
// print the timer result
cout
<<
" us. Sent: "
<<
payload
<<
endl
;
// print payload sent
if
(
mcount
>=
2
){
payload
=
-
1
;
}
}
else
{
// payload was not delivered
cout
<<
"Transmission failed or timed out"
<<
endl
;
}
mcount
++
;
// to make this program readable in the terminal
delay
(
1000
);
// slow transmissions down by 1 second
}
cout
<<
"Leaving TX role.
\n
"
<<
endl
;
}
/**
* make this node act as the receiver
*/
void
slave
()
{
radio
.
startListening
();
// put radio in RX mode
cout
<<
"Start RX role."
<<
endl
;
time_t
startTimer
=
time
(
nullptr
);
// start a timer
while
(
time
(
nullptr
)
-
startTimer
<
6
)
{
// use 6 second timeout
uint8_t
pipe
;
if
(
radio
.
available
(
&
pipe
))
{
// is there a payload? get the pipe number that recieved it
uint8_t
bytes
=
radio
.
getPayloadSize
();
// get the size of the payload
radio
.
read
(
&
payload
,
bytes
);
// fetch payload from FIFO
cout
<<
"Received "
;
// print the size of the payload
cout
<<
": "
<<
payload
<<
endl
;
// print the payload's value
}
}
//After 6 seconds of listening convert to transmiter again
cout
<<
"Leaving RX role.
\n
"
<<
endl
;
radio
.
stopListening
();
}
/**
* Calculate the elapsed time in microseconds
*/
uint32_t
getMicros
()
{
// this function assumes that the timer was started using
// `clock_gettime(CLOCK_MONOTONIC_RAW, &startTimer);`
clock_gettime
(
CLOCK_MONOTONIC_RAW
,
&
endTimer
);
uint32_t
seconds
=
endTimer
.
tv_sec
-
startTimer
.
tv_sec
;
uint32_t
useconds
=
(
endTimer
.
tv_nsec
-
startTimer
.
tv_nsec
)
/
1000
;
return
((
seconds
)
*
1000
+
useconds
)
+
0.5
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment