Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
Firmware
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
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
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Alberto Ruiz Garcia
Firmware
Commits
88dc6ec1
Commit
88dc6ec1
authored
10 years ago
by
Mark Charlebois
Browse files
Options
Downloads
Patches
Plain Diff
Simulator: use template for Reports
Signed-off-by:
Mark Charlebois
<
charlebm@gmail.com
>
parent
2f5bfe0c
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/modules/simulator/simulator.cpp
+11
-58
11 additions, 58 deletions
src/modules/simulator/simulator.cpp
src/modules/simulator/simulator.h
+70
-67
70 additions, 67 deletions
src/modules/simulator/simulator.h
with
81 additions
and
125 deletions
src/modules/simulator/simulator.cpp
+
11
−
58
View file @
88dc6ec1
...
...
@@ -46,59 +46,12 @@
#include
<netinet/in.h>
#include
"simulator.h"
using
namespace
simulator
;
static
px4_task_t
g_sim_task
=
-
1
;
Simulator
*
Simulator
::
_instance
=
NULL
;
SimulatorReport
::
SimulatorReport
(
int
readers
,
int
reportLen
)
:
_max_readers
(
readers
),
_report_len
(
reportLen
)
{
sem_init
(
&
_lock
,
0
,
_max_readers
);
}
bool
SimulatorReport
::
copyData
(
void
*
inbuf
,
void
*
outbuf
,
int
len
)
{
if
(
len
!=
_report_len
)
{
return
false
;
}
read_lock
();
memcpy
(
inbuf
,
outbuf
,
_report_len
);
read_unlock
();
return
true
;
}
bool
SimulatorReport
::
writeData
(
void
*
inbuf
,
void
*
outbuf
,
int
len
)
{
if
(
len
!=
_report_len
)
{
return
false
;
}
memcpy
(
inbuf
,
outbuf
,
_report_len
);
swapBuffers
();
return
true
;
}
void
SimulatorReport
::
read_lock
()
{
sem_wait
(
&
_lock
);
}
void
SimulatorReport
::
read_unlock
()
{
sem_post
(
&
_lock
);
}
void
SimulatorReport
::
write_lock
()
{
for
(
int
i
=
0
;
i
<
_max_readers
;
i
++
)
{
sem_wait
(
&
_lock
);
}
}
void
SimulatorReport
::
write_unlock
()
{
for
(
int
i
=
0
;
i
<
_max_readers
;
i
++
)
{
sem_post
(
&
_lock
);
}
}
Simulator
*
Simulator
::
getInstance
()
{
return
_instance
;
...
...
@@ -106,17 +59,17 @@ Simulator *Simulator::getInstance()
bool
Simulator
::
getMPUReport
(
uint8_t
*
buf
,
int
len
)
{
return
_mpu
.
copyData
(
buf
,
&
_mpu
.
_data
[
_mpu
.
getReadIdx
()],
len
);
return
_mpu
.
copyData
(
buf
,
len
);
}
bool
Simulator
::
getRawAccelReport
(
uint8_t
*
buf
,
int
len
)
{
return
_accel
.
copyData
(
buf
,
&
_accel
.
_data
[
_accel
.
getReadIdx
()],
len
);
return
_accel
.
copyData
(
buf
,
len
);
}
bool
Simulator
::
getBaroSample
(
uint8_t
*
buf
,
int
len
)
{
return
_baro
.
copyData
(
buf
,
&
_baro
.
_data
[
_baro
.
getReadIdx
()],
len
);
return
_baro
.
copyData
(
buf
,
len
);
}
int
Simulator
::
start
(
int
argc
,
char
*
argv
[])
...
...
@@ -162,17 +115,17 @@ void Simulator::updateSamples()
for
(;;)
{
len
=
recvfrom
(
fd
,
buf
,
buflen
,
0
,
(
struct
sockaddr
*
)
&
srcaddr
,
&
addrlen
);
if
(
len
>
0
)
{
if
(
len
==
sizeof
(
MPUReport
::
RawMPUData
))
{
if
(
len
==
sizeof
(
RawMPUData
))
{
printf
(
"received: MPU data
\n
"
);
_mpu
.
writeData
(
&
_mpu
.
_data
[
_mpu
.
getWriteIdx
()],
buf
,
len
);
_mpu
.
writeData
(
buf
);
}
else
if
(
len
==
sizeof
(
RawAccelReport
::
RawAccelData
))
{
else
if
(
len
==
sizeof
(
RawAccelData
))
{
printf
(
"received: accel data
\n
"
);
_accel
.
writeData
(
&
_accel
.
_data
[
_accel
.
getWriteIdx
()],
buf
,
len
);
_accel
.
writeData
(
buf
);
}
else
if
(
len
==
sizeof
(
BaroReport
::
RawBaroData
))
{
else
if
(
len
==
sizeof
(
RawBaroData
))
{
printf
(
"received: accel data
\n
"
);
_baro
.
writeData
(
&
_baro
.
_data
[
_baro
.
getWriteIdx
()],
buf
,
len
);
_baro
.
writeData
(
buf
);
}
else
{
printf
(
"bad packet: len = %d
\n
"
,
len
);
...
...
This diff is collapsed.
Click to expand it.
src/modules/simulator/simulator.h
+
70
−
67
View file @
88dc6ec1
...
...
@@ -40,83 +40,85 @@
#include
<semaphore.h>
class
SimulatorReport
{
namespace
simulator
{
// FIXME - what is the endianness of these on actual device?
#pragma pack(push, 1)
struct
RawAccelData
{
int16_t
x
;
int16_t
y
;
int16_t
z
;
};
#pragma pack(pop)
#pragma pack(push, 1)
struct
RawMPUData
{
uint8_t
accel_x
[
2
];
uint8_t
accel_y
[
2
];
uint8_t
accel_z
[
2
];
uint8_t
temp
[
2
];
uint8_t
gyro_x
[
2
];
uint8_t
gyro_y
[
2
];
uint8_t
gyro_z
[
2
];
};
#pragma pack(pop)
struct
RawBaroData
{
uint8_t
d
[
3
];
};
template
<
typename
RType
>
class
Report
{
public:
SimulatorReport
(
int
readers
,
int
reportLen
);
~
SimulatorReport
()
{};
Report
(
int
readers
)
:
_max_readers
(
readers
),
_report_len
(
sizeof
(
RType
))
{
sem_init
(
&
_lock
,
0
,
_max_readers
);
}
int
getReadIdx
()
{
return
_readidx
;
}
int
getWriteIdx
()
{
return
!
_readidx
;
}
~
Report
()
{};
bool
copyData
(
void
*
inbuf
,
void
*
outbuf
,
int
len
);
bool
writeData
(
void
*
inbuf
,
void
*
outbuf
,
int
len
);
bool
copyData
(
void
*
outbuf
,
int
len
)
{
if
(
len
!=
_report_len
)
{
return
false
;
}
read_lock
();
memcpy
(
outbuf
,
&
_buf
[
_readidx
],
_report_len
);
read_unlock
();
return
true
;
}
void
writeData
(
void
*
inbuf
)
{
write_lock
();
memcpy
(
&
_buf
[
!
_readidx
],
inbuf
,
_report_len
);
_readidx
=
!
_readidx
;
write_unlock
();
}
protected
:
void
read_lock
();
void
read_unlock
();
void
write_lock
();
void
write_unlock
();
void
swapBuffers
()
void
read_lock
()
{
sem_wait
(
&
_lock
);
}
void
read_unlock
()
{
sem_post
(
&
_lock
);
}
void
write_lock
()
{
for
(
int
i
=
0
;
i
<
_max_readers
;
i
++
)
{
sem_wait
(
&
_lock
);
}
}
void
write_unlock
()
{
write_lock
();
_readidx
=
!
_readidx
;
write_unlock
();
for
(
int
i
=
0
;
i
<
_max_readers
;
i
++
)
{
sem_post
(
&
_lock
)
;
}
}
int
_readidx
;
sem_t
_lock
;
const
int
_max_readers
;
const
int
_report_len
;
RType
_buf
[
2
];
};
class
RawAccelReport
:
public
SimulatorReport
{
public:
RawAccelReport
()
:
SimulatorReport
(
1
,
sizeof
(
RawAccelData
))
{}
~
RawAccelReport
()
{}
// FIXME - what is the endianness of these on actual device?
#pragma pack(push, 1)
struct
RawAccelData
{
int16_t
x
;
int16_t
y
;
int16_t
z
;
};
#pragma pack(pop)
RawAccelData
_data
[
2
];
};
class
MPUReport
:
public
SimulatorReport
{
public:
MPUReport
()
:
SimulatorReport
(
1
,
sizeof
(
RawMPUData
))
{}
~
MPUReport
()
{}
#pragma pack(push, 1)
struct
RawMPUData
{
uint8_t
accel_x
[
2
];
uint8_t
accel_y
[
2
];
uint8_t
accel_z
[
2
];
uint8_t
temp
[
2
];
uint8_t
gyro_x
[
2
];
uint8_t
gyro_y
[
2
];
uint8_t
gyro_z
[
2
];
};
#pragma pack(pop)
RawMPUData
_data
[
2
];
};
class
BaroReport
:
public
SimulatorReport
{
public:
BaroReport
()
:
SimulatorReport
(
1
,
sizeof
(
RawBaroData
))
{}
~
BaroReport
()
{}
struct
RawBaroData
{
uint8_t
d
[
3
];
};
RawBaroData
_data
[
2
];
};
class
Simulator
{
...
...
@@ -143,14 +145,15 @@ public:
bool
getMPUReport
(
uint8_t
*
buf
,
int
len
);
bool
getBaroSample
(
uint8_t
*
buf
,
int
len
);
private
:
Simulator
()
{}
Simulator
()
:
_accel
(
1
),
_mpu
(
1
),
_baro
(
1
)
{}
~
Simulator
()
{
_instance
=
NULL
;
}
void
updateSamples
();
static
Simulator
*
_instance
;
RawAccelReport
_accel
;
MPUReport
_mpu
;
BaroReport
_baro
;
simulator
::
Report
<
simulator
::
RawAccelData
>
_accel
;
simulator
::
Report
<
simulator
::
RawMPUData
>
_mpu
;
simulator
::
Report
<
simulator
::
RawBaroData
>
_baro
;
};
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