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
fda25e9f
Commit
fda25e9f
authored
6 years ago
by
Daniel Agar
Committed by
Lorenz Meier
6 years ago
Browse files
Options
Downloads
Patches
Plain Diff
systemlib delete unused ppm_decode
parent
d0bde9ab
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/systemlib/ppm_decode.c
+0
-255
0 additions, 255 deletions
src/modules/systemlib/ppm_decode.c
src/modules/systemlib/ppm_decode.h
+0
-22
0 additions, 22 deletions
src/modules/systemlib/ppm_decode.h
with
0 additions
and
277 deletions
src/modules/systemlib/ppm_decode.c
deleted
100644 → 0
+
0
−
255
View file @
d0bde9ab
/****************************************************************************
*
* Copyright (C) 2012 PX4 Development Team. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name PX4 nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/**
* @file ppm_decode.c
*
* PPM input decoder.
*/
#include
<px4_config.h>
#include
<stdint.h>
#include
<string.h>
#include
<drivers/drv_hrt.h>
#include
"ppm_decode.h"
/*
* PPM decoder tuning parameters.
*
* The PPM decoder works as follows.
*
* Initially, the decoder waits in the UNSYNCH state for two edges
* separated by PPM_MIN_START. Once the second edge is detected,
* the decoder moves to the ARM state.
*
* The ARM state expects an edge within PPM_MAX_PULSE_WIDTH, being the
* timing mark for the first channel. If this is detected, it moves to
* the INACTIVE state.
*
* The INACTIVE phase waits for and discards the next edge, as it is not
* significant. Once the edge is detected, it moves to the ACTIVE stae.
*
* The ACTIVE state expects an edge within PPM_MAX_PULSE_WIDTH, and when
* received calculates the time from the previous mark and records
* this time as the value for the next channel.
*
* If at any time waiting for an edge, the delay from the previous edge
* exceeds PPM_MIN_START the frame is deemed to have ended and the recorded
* values are advertised to clients.
*/
#define PPM_MAX_PULSE_WIDTH 500
/* maximum width of a pulse */
#define PPM_MIN_CHANNEL_VALUE 800
/* shortest valid channel signal */
#define PPM_MAX_CHANNEL_VALUE 2200
/* longest valid channel signal */
#define PPM_MIN_START 2500
/* shortest valid start gap */
/* Input timeout - after this interval we assume signal is lost */
#define PPM_INPUT_TIMEOUT 100 * 1000
/* 100ms */
/* Number of same-sized frames required to 'lock' */
#define PPM_CHANNEL_LOCK 3
/* should be less than the input timeout */
/* decoded PPM buffer */
#define PPM_MIN_CHANNELS 4
#define PPM_MAX_CHANNELS 12
/*
* Public decoder state
*/
uint16_t
ppm_buffer
[
PPM_MAX_CHANNELS
];
unsigned
ppm_decoded_channels
;
hrt_abstime
ppm_last_valid_decode
;
static
uint16_t
ppm_temp_buffer
[
PPM_MAX_CHANNELS
];
/* PPM decoder state machine */
static
struct
{
uint16_t
last_edge
;
/* last capture time */
uint16_t
last_mark
;
/* last significant edge */
unsigned
next_channel
;
unsigned
count_max
;
enum
{
UNSYNCH
=
0
,
ARM
,
ACTIVE
,
INACTIVE
}
phase
;
}
ppm
;
void
ppm_input_init
(
unsigned
count_max
)
{
ppm_decoded_channels
=
0
;
ppm_last_valid_decode
=
0
;
memset
(
&
ppm
,
0
,
sizeof
(
ppm
));
ppm
.
count_max
=
count_max
;
}
void
ppm_input_decode
(
bool
reset
,
unsigned
count
)
{
uint16_t
width
;
uint16_t
interval
;
unsigned
i
;
/* if we missed an edge, we have to give up */
if
(
reset
)
{
goto
error
;
}
/* how long since the last edge? */
width
=
count
-
ppm
.
last_edge
;
if
(
count
<
ppm
.
last_edge
)
{
width
+=
ppm
.
count_max
;
/* handle wrapped count */
}
ppm
.
last_edge
=
count
;
/*
* If this looks like a start pulse, then push the last set of values
* and reset the state machine.
*
* Note that this is not a "high performance" design; it implies a whole
* frame of latency between the pulses being received and their being
* considered valid.
*/
if
(
width
>=
PPM_MIN_START
)
{
/*
* If the number of channels changes unexpectedly, we don't want
* to just immediately jump on the new count as it may be a result
* of noise or dropped edges. Instead, take a few frames to settle.
*/
if
(
ppm
.
next_channel
!=
ppm_decoded_channels
)
{
static
unsigned
new_channel_count
;
static
unsigned
new_channel_holdoff
;
if
(
new_channel_count
!=
ppm
.
next_channel
)
{
/* start the lock counter for the new channel count */
new_channel_count
=
ppm
.
next_channel
;
new_channel_holdoff
=
PPM_CHANNEL_LOCK
;
}
else
if
(
new_channel_holdoff
>
0
)
{
/* this frame matched the last one, decrement the lock counter */
new_channel_holdoff
--
;
}
else
{
/* we have seen PPM_CHANNEL_LOCK frames with the new count, accept it */
ppm_decoded_channels
=
new_channel_count
;
new_channel_count
=
0
;
}
}
else
{
/* frame channel count matches expected, let's use it */
if
(
ppm
.
next_channel
>
PPM_MIN_CHANNELS
)
{
for
(
i
=
0
;
i
<
ppm
.
next_channel
;
i
++
)
{
ppm_buffer
[
i
]
=
ppm_temp_buffer
[
i
];
}
ppm_last_valid_decode
=
hrt_absolute_time
();
}
}
/* reset for the next frame */
ppm
.
next_channel
=
0
;
/* next edge is the reference for the first channel */
ppm
.
phase
=
ARM
;
return
;
}
switch
(
ppm
.
phase
)
{
case
UNSYNCH
:
/* we are waiting for a start pulse - nothing useful to do here */
return
;
case
ARM
:
/* we expect a pulse giving us the first mark */
if
(
width
>
PPM_MAX_PULSE_WIDTH
)
{
goto
error
;
/* pulse was too long */
}
/* record the mark timing, expect an inactive edge */
ppm
.
last_mark
=
count
;
ppm
.
phase
=
INACTIVE
;
return
;
case
INACTIVE
:
/* this edge is not interesting, but now we are ready for the next mark */
ppm
.
phase
=
ACTIVE
;
/* note that we don't bother looking at the timing of this edge */
return
;
case
ACTIVE
:
/* we expect a well-formed pulse */
if
(
width
>
PPM_MAX_PULSE_WIDTH
)
{
goto
error
;
/* pulse was too long */
}
/* determine the interval from the last mark */
interval
=
count
-
ppm
.
last_mark
;
ppm
.
last_mark
=
count
;
/* if the mark-mark timing is out of bounds, abandon the frame */
if
((
interval
<
PPM_MIN_CHANNEL_VALUE
)
||
(
interval
>
PPM_MAX_CHANNEL_VALUE
))
{
goto
error
;
}
/* if we have room to store the value, do so */
if
(
ppm
.
next_channel
<
PPM_MAX_CHANNELS
)
{
ppm_temp_buffer
[
ppm
.
next_channel
++
]
=
interval
;
}
ppm
.
phase
=
INACTIVE
;
return
;
}
/* the state machine is corrupted; reset it */
error:
/* we don't like the state of the decoder, reset it and try again */
ppm
.
phase
=
UNSYNCH
;
ppm_decoded_channels
=
0
;
}
This diff is collapsed.
Click to expand it.
src/modules/systemlib/ppm_decode.h
+
0
−
22
View file @
fda25e9f
...
...
@@ -61,26 +61,4 @@ __EXPORT extern uint16_t ppm_frame_length; /**< length of the decoded PPM fra
__EXPORT
extern
unsigned
ppm_decoded_channels
;
/**< count of decoded channels */
__EXPORT
extern
hrt_abstime
ppm_last_valid_decode
;
/**< timestamp of the last valid decode */
/**
* Initialise the PPM input decoder.
*
* @param count_max The maximum value of the counter passed to
* ppm_input_decode, used to determine how to
* handle counter wrap.
*/
__EXPORT
void
ppm_input_init
(
unsigned
count_max
);
/**
* Inform the decoder of an edge on the PPM input.
*
* This function can be registered with the HRT as the PPM edge handler.
*
* @param reset If set, the edge detector has missed one or
* more edges and the decoder needs to be reset.
* @param count A microsecond timestamp corresponding to the
* edge, in the range 0-count_max. This value
* is expected to wrap.
*/
__EXPORT
void
ppm_input_decode
(
bool
reset
,
unsigned
count
);
__END_DECLS
\ No newline at end of file
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