first commit

This commit is contained in:
Your Name
2022-10-20 20:29:11 +08:00
commit 4d531f8044
3238 changed files with 1387862 additions and 0 deletions

18
examples/dds/README Normal file
View File

@@ -0,0 +1,18 @@
Data Distribution Service (DDS) logger
This example uses a waitset to listens to the FlightGear GUI, FDM adn Ctrls
DDS topics and logs some data for any of them when new data arrives.
Run FlightGear with any combination of the following command line arguments to
get it to produce new DDS samples:
fgfs
--native-gui=dds,out,30
--native-fdm=dds,out,60
--native-ctrls=dds,out,10
The executable has to be linkes against the CycloneDDS ddsc component and
all *.c files in src/Network/DDS:
gcc -I ../../src fgfdm_log.c ../../src/Network/DDS/*.c -l ddsc -o fgfdm_log

219
examples/dds/fgfdm_log.c Normal file
View File

@@ -0,0 +1,219 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <dds/dds.h>
#include <Network/DDS/dds_gui.h>
#include <Network/DDS/dds_fdm.h>
#include <Network/DDS/dds_ctrls.h>
/* An array of one message(aka sample in dds terms) will be used. */
#define MAX_SAMPLES 1
#ifndef _WIN32
# include <termios.h>
void set_mode(int want_key)
{
static struct termios old, new;
if (!want_key) {
tcsetattr(STDIN_FILENO, TCSANOW, &old);
return;
}
tcgetattr(STDIN_FILENO, &old);
new = old;
new.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &new);
}
int get_key()
{
int c = 0;
struct timeval tv;
fd_set fs;
tv.tv_usec = tv.tv_sec = 0;
FD_ZERO(&fs);
FD_SET(STDIN_FILENO, &fs);
select(STDIN_FILENO + 1, &fs, 0, 0, &tv);
if (FD_ISSET(STDIN_FILENO, &fs)) {
c = getchar();
}
return c;
}
#else
# include <conio.h>
int get_key()
{
if (kbhit()) {
return getch();
}
return 0;
}
void set_mode(int want_key)
{
}
#endif
int main()
{
dds_entity_t participant;
dds_entity_t gui_topic;
dds_entity_t fdm_topic;
dds_entity_t ctrls_topic;
dds_entity_t gui_reader;
dds_entity_t fdm_reader;
dds_entity_t ctrls_reader;
dds_entity_t rdcond;
void *samples[MAX_SAMPLES];
dds_sample_info_t infos[MAX_SAMPLES];
dds_return_t rc;
dds_qos_t *qos;
int status;
/* Initialize sample buffer, by pointing the void pointer within
* the buffer array to a valid sample memory location. */
samples[0] = FG_DDS_FDM__alloc ();
/* Create a Participant. */
participant = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL);
if(participant < 0)
DDS_FATAL("dds_create_participant: %s\n", dds_strretcode(-participant));
/* Create a wait set */
dds_entity_t waitset = dds_create_waitset(participant);
qos = dds_create_qos();
dds_qset_reliability(qos, DDS_RELIABILITY_RELIABLE, DDS_SECS(10));
/* Create a GUI Topic. */
gui_topic = dds_create_topic(
participant, &FG_DDS_GUI_desc, "FG_DDS_GUI", NULL, NULL);
if(gui_topic < 0)
DDS_FATAL("dds_create_topic: %s\n", dds_strretcode(-gui_topic));
gui_reader = dds_create_reader(participant, gui_topic, qos, NULL);
if(gui_reader < 0)
DDS_FATAL("dds_create_reader: %s\n", dds_strretcode(-gui_reader));
rdcond = dds_create_readcondition(gui_reader, DDS_NOT_READ_SAMPLE_STATE);
status = dds_waitset_attach(waitset, rdcond, gui_reader);
if (status < 0)
DDS_FATAL("ds_waitset_attach: %s\n", dds_strretcode(-status));
/* Create an FDM Topic. */
fdm_topic = dds_create_topic(
participant, &FG_DDS_FDM_desc, "FG_DDS_FDM", NULL, NULL);
if(fdm_topic < 0)
DDS_FATAL("dds_create_topic: %s\n", dds_strretcode(-fdm_topic));
fdm_reader = dds_create_reader(participant, fdm_topic, qos, NULL);
if(fdm_reader < 0)
DDS_FATAL("dds_create_reader: %s\n", dds_strretcode(-fdm_reader));
rdcond = dds_create_readcondition(fdm_reader, DDS_NOT_READ_SAMPLE_STATE);
status = dds_waitset_attach(waitset, rdcond, fdm_reader);
if (status < 0)
DDS_FATAL("ds_waitset_attach: %s\n", dds_strretcode(-status));
/* Create a Ctrls Topic. */
ctrls_topic = dds_create_topic(
participant, &FG_DDS_Ctrls_desc, "FG_DDS_Ctrls", NULL, NULL);
if(ctrls_topic < 0)
DDS_FATAL("dds_create_topic: %s\n", dds_strretcode(-ctrls_topic));
ctrls_reader = dds_create_reader(participant, ctrls_topic, qos, NULL);
if(ctrls_reader < 0)
DDS_FATAL("dds_create_reader: %s\n", dds_strretcode(-ctrls_reader));
rdcond = dds_create_readcondition(ctrls_reader, DDS_NOT_READ_SAMPLE_STATE);
status = dds_waitset_attach(waitset, rdcond, ctrls_reader);
if (status < 0)
DDS_FATAL("ds_waitset_attach: %s\n", dds_strretcode(-status));
dds_delete_qos(qos);
printf("\n=== [fgfdm_log] Waiting for a sample ...\n");
fflush(stdout);
/* Wait for a new packet. */
set_mode(1);
size_t num = 1;
dds_attach_t results[num];
dds_duration_t timeout = DDS_MSECS(500);
while(dds_waitset_wait(waitset, results, num, timeout) >= 0)
{
/* Do the actual read.
* The return value contains the number of read samples. */
rc = dds_take(gui_reader, samples, infos, 1, 1);
if(rc < 0)
DDS_FATAL("dds_read: (gui) %s\n", dds_strretcode(-rc));
if((rc > 0) &&(infos[0].valid_data))
{
FG_DDS_GUI *gui = (FG_DDS_GUI*) samples[0];
printf("=== [fgfdm_log] Received : ");
printf("GUI Message:\n");
printf(" version: %i\n", gui->version);
printf(" tuned_freq: %lf\n", gui->tuned_freq);
printf(" nav_radial: %lf\n", gui->nav_radial);
printf(" dist_nm: %lf\n", gui->dist_nm);
}
rc = dds_take(fdm_reader, samples, infos, 1, 1);
if(rc < 0)
DDS_FATAL("dds_read: (fdm) %s\n", dds_strretcode(-rc));
/* Check if we read some data and it is valid. */
if((rc > 0) &&(infos[0].valid_data))
{
/* Print Message. */
FG_DDS_FDM *fdm = (FG_DDS_FDM*) samples[0];
printf("=== [fgfdm_log] Received : ");
printf("FDM Message:\n");
printf(" version: %i\n", fdm->version);
printf(" longitude: %lf\n", fdm->longitude);
printf(" latitude: %lf\n", fdm->latitude);
printf(" altitude: %lf\n", fdm->altitude);
}
rc = dds_take(ctrls_reader, samples, infos, 1, 1);
if(rc < 0)
DDS_FATAL("dds_read: (ctrls) %s\n", dds_strretcode(-rc));
/* Check if we read some data and it is valid. */
if((rc > 0) &&(infos[0].valid_data))
{
/* Print Message. */
FG_DDS_Ctrls *ctrls = (FG_DDS_Ctrls*) samples[0];
printf("=== [fgfdm_log] Received : ");
printf("Ctrls Message:\n");
printf(" version: %i\n", ctrls->version);
printf(" aileron: %lf\n", ctrls->aileron);
printf(" elevator: %lf\n", ctrls->elevator);
printf(" rudder: %lf\n", ctrls->rudder);
}
fflush(stdout);
if (get_key()) break;
}
set_mode(0);
/* Free the data location. */
FG_DDS_FDM_free (samples[0], DDS_FREE_ALL);
/* Deleting the participant will delete all its children recursively as well. */
rc = dds_delete(participant);
if(rc != DDS_RETCODE_OK)
DDS_FATAL("dds_delete: %s\n", dds_strretcode(-rc));
return EXIT_SUCCESS;
}