Skip to content

Commit

Permalink
[dc] add pprzlink digital cam module and factorize modules (#3111)
Browse files Browse the repository at this point in the history
- new digital_cam_pprzlink module
- factorize module with digital_cam_common
- rename digital_cam to digital_cam_gpio
- add test nodes to modules
  • Loading branch information
gautierhattenberger committed Sep 27, 2023
1 parent 63fd583 commit 6948aef
Show file tree
Hide file tree
Showing 24 changed files with 317 additions and 178 deletions.
2 changes: 1 addition & 1 deletion conf/airframes/ENAC/fixed-wing/hawkeye.xml
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
<configure name="EXTRA_DL_PORT" value="UART6"/>
<configure name="EXTRA_DL_BAUD" value="B115200"/>
</module>
<module name="digital_cam">
<module name="digital_cam_gpio">
<define name="DC_SHUTTER_GPIO" value="GPIOB,GPIO15"/> <!-- Apogee AUX4 -->
<define name="DC_AUTOSHOOT_DISTANCE_INIT" value="4"/>
</module>
Expand Down
2 changes: 1 addition & 1 deletion conf/airframes/OPENUAS/openuas_3dr_iris_plus.xml
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@
<define name="POLYSURVEY_DEFAULT_DISTANCE" value="10"/><!-- in M -->
</module>

<!--<module name="digital_cam">-->
<!--<module name="digital_cam_gpio">-->
<!-- <define name="DC_SHUTTER_GPIO" value="GPIOB,GPIO22"/>--> <!-- should be value="CAM_SWITCH_GPIO"/>-->
<!--</module>-->

Expand Down
2 changes: 1 addition & 1 deletion conf/airframes/OPENUAS/openuas_multiplex_twinstar_nd.xml
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ NOTES:
<module name="photogrammetry_calculator"/>

<!--Unkn aux camsw -->
<module name="digital_cam">
<module name="digital_cam_gpio">
<define name="DC_SHUTTER_GPIO" value="GPIOB,GPIO2"/><!-- correct pin add to board file one from Wifi pins-->
</module>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -225,7 +225,7 @@
<define name="AGL_DIST_FILTER" value="0.1"/>
</module>

<!--<module name="digital_cam">-->
<!--<module name="digital_cam_gpio">-->
<!-- <define name="DC_SHUTTER_GPIO" value="GPIOB,GPIO22"/>--> <!-- should be value="CAM_SWITCH_GPIO"/>-->
<!--</module>-->

Expand Down
2 changes: 1 addition & 1 deletion conf/airframes/examples/MentorEnergy.xml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@
<define name="STROBE_LIGHT_MODE_DEFAULT" value="6"/>
<define name="NAV_LIGHT_MODE_DEFAULT" value="4"/>
</module>
<module name="digital_cam">
<module name="digital_cam_gpio">
<define name="DC_SHUTTER_GPIO" value="GPIOC,GPIO12"/>
</module>
<!-- module name="nav" type="catapult"/-->
Expand Down
2 changes: 1 addition & 1 deletion conf/airframes/examples/separate_fbw_ap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@
</module>

<!-- <module name="digital_cam_i2c"/> -->
<module name="digital_cam">
<module name="digital_cam_gpio">
<define name="DC_SHUTTER_GPIO" value="GPIOC,GPIO12"/>
</module>

Expand Down
68 changes: 7 additions & 61 deletions conf/modules/digital_cam.xml
Original file line number Diff line number Diff line change
@@ -1,74 +1,20 @@
<!DOCTYPE module SYSTEM "./module.dtd">

<module name="digital_cam">
<module name="digital_cam" dir="digital_cam">
<doc>
<description>
Digital Photo Camera Triggering (using a GPIO pin)

This module controls triggering of an attached external digital camera via one or more GPIO pins for on/off/shoot/zoom.
It can trigger photos based on GPS distance, time or circle radius in both fixedwings and rotorcraft.
Deprecated, use digital_cam_gpio module instead
</description>
<define name="DC_SHOOT_ON_BUTTON_RELEASE" description="if defined, call dc_send_shot_postion on button release instead of on push"/>
<define name="DC_SHUTTER_GPIO" value="GPIOC,GPIO12" description="mandatory, gpio to control shutter"/>
<define name="DC_ZOOM_IN_GPIO" value="GPIOC,GPIO2" description="optional, gpio to activate zoom in"/>
<define name="DC_ZOOM_OUT_GPIO" value="GPIOC,GPIO5" description="optional, gpio to activate zoom out"/>
<define name="DC_POWER_GPIO" value="GPIOB,GPIO1" description="optional, gpio to turn power on"/>
<define name="DC_POWER_OFF_GPIO" value="GPIOC,GPIO1" description="optional, gpio to turn power off"/>
<define name="DC_PUSH" value="gpio_set|gpio_clear" description="specifies whether to set or clear gpio to push the shutter (default: gpio_set)"/>
<define name="DC_RELEASE" value="gpio_clear|gpio_set" description="specifies whether to set or clear gpio to release the shutter (default: gpio_clear)"/>
<define name="DC_SHUTTER_DELAY" value="0.5" description="how long to push shutter in seconds"/>
<define name="DC_POWER_OFF_DELAY" value="0.75" description="how long to send power off in seconds"/>

<define name="DC_AUTOSHOOT_PERIOD" value="1.0" description="time period for DC_AUTOSHOOT_PERIODIC in seconds"/>
<define name="DC_AUTOSHOOT_DISTANCE_INTERVAL" value="50" description="distance interval for DC_AUTOSHOOT_DISTANCE in meters"/>
<define name="DC_AUTOSHOOT_SURVEY_INTERVAL" value="50" description="distance interval for DC_AUTOSHOOT_SURVEY in meters"/>
<define name="DC_SHOT_SYNC_SEND" value="TRUE|FALSE" description="send DC_SHOT message when photo was taken (default: TRUE)"/>
<define name="DC_SHOT_EXTRA_DL" value="TRUE|FALSE" description="send DC_SHOT message other extra datalink like companion CPU (default: FALSE, requires DC_SHOT_SYNC_SEND)"/>
</doc>
<settings>
<dl_settings name="control">
<dl_settings name="dc">

<dl_setting max="255" min="0" step="1" module="digital_cam/dc" var="0" handler="send_command" shortname="Shutter">
<strip_button name="Photo" icon="digital-camera.png" value="32" group="maindc"/>
<strip_button name="Power" icon="off.png" value="111" group="maindc"/>
<strip_button name="ZoomIn" icon="zoom.png" value="116" group="dczoom"/>
<strip_button name="ZoomOut" icon="zoom.png" value="119" group="dczoom"/>
</dl_setting>

<dl_setting max="3" min="0" step="1" var="dc_autoshoot" values="STOP|PERIODIC|DISTANCE|EXT_TRIG">
<strip_button name="Start Autoshoot" icon="dcstart.png" value="1" group="dcauto"/>
<strip_button name="Stop Autoshoot" icon="dcstart.png" value="0" group="dcauto"/>
</dl_setting>

<dl_setting max="60" min="0.1" step="0.5" var="dc_autoshoot_period" shortname="Periodic" param="DC_AUTOSHOOT_PERIOD" unit="sec"/>
<dl_setting max="255" min="0" step="1" var="dc_distance_interval" shortname="dist" param="DC_AUTOSHOOT_DISTANCE_INTERVAL" unit="meter"/>

<dl_setting max="250" min="0" step="5" module="digital_cam/dc" var="dc_survey_interval" handler="Survey" shortname="Survey-Interval"/>
<dl_setting max="90" min="5" step="5" module="digital_cam/dc" var="dc_circle_interval" handler="Circle" shortname="Circle-Interval"/>
<dl_setting max="1" min="0" step="1" var="dc_cam_tracing" shortname="Cam-Tracing"/>
</dl_settings>
</dl_settings>
</settings>

<dep>
<conflicts>digital_cam_i2c,digital_cam_servo,digital_cam_uart,digital_cam_video</conflicts>
<provides>digital_cam</provides>
<depends>digital_cam_gpio</depends>
</dep>

<header>
<file name="gpio_cam_ctrl.h"/>
<file name="dc.h"/>
</header>

<init fun="gpio_cam_ctrl_init()"/>

<periodic fun="gpio_cam_ctrl_periodic()" freq="10" autorun="TRUE"/>

<makefile target="ap|sim|nps">
<define name="DIGITAL_CAM" />
<file name="gpio_cam_ctrl.c"/>
<file name="dc.c"/>
<makefile>
<raw>
$(warning Warning: digital_cam is deprecated. Use digital_cam_gpio instead.)
</raw>
</makefile>

</module>
61 changes: 61 additions & 0 deletions conf/modules/digital_cam_common.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<!DOCTYPE module SYSTEM "./module.dtd">

<module name="digital_cam_common" dir="digital_cam">
<doc>
<description>
Digital Photo Camera Triggering, common interface

This module controls triggering of an attached external digital camera.
It can trigger photos based on GPS distance, time or circle radius in both fixedwings and rotorcraft.
The specific way to trigger the camera is implemented in specific modules.
</description>
<section name="DIGITAL_CAM" prefix="DC_">
<define name="AUTOSHOOT_PERIOD" value="1.0" description="time period for DC_AUTOSHOOT_PERIODIC in seconds"/>
<define name="AUTOSHOOT_DISTANCE_INTERVAL" value="50" description="distance interval for DC_AUTOSHOOT_DISTANCE in meters"/>
<define name="AUTOSHOOT_SURVEY_INTERVAL" value="50" description="distance interval for DC_AUTOSHOOT_SURVEY in meters"/>
<define name="SHOT_SYNC_SEND" value="TRUE|FALSE" description="send DC_SHOT message when photo was taken (default: TRUE)"/>
<define name="SHOT_EXTRA_DL" value="TRUE|FALSE" description="send DC_SHOT message other extra datalink like companion CPU (default: FALSE, requires DC_SHOT_SYNC_SEND)"/>
</section>
</doc>
<settings>
<dl_settings name="control">
<dl_settings name="dc">

<dl_setting max="255" min="0" step="1" module="digital_cam/dc" var="0" handler="send_command" shortname="Shutter">
<strip_button name="Photo" icon="digital-camera.png" value="32" group="maindc"/>
<strip_button name="Power" icon="off.png" value="111" group="maindc"/>
<strip_button name="ZoomIn" icon="zoom.png" value="116" group="dczoom"/>
<strip_button name="ZoomOut" icon="zoom.png" value="119" group="dczoom"/>
</dl_setting>

<dl_setting max="3" min="0" step="1" var="dc_autoshoot" values="STOP|PERIODIC|DISTANCE|EXT_TRIG|SURVEY|CIRCLE">
<strip_button name="Start Autoshoot" icon="dcstart.png" value="1" group="dcauto"/>
<strip_button name="Stop Autoshoot" icon="dcstart.png" value="0" group="dcauto"/>
</dl_setting>

<dl_setting max="60" min="0.1" step="0.5" var="dc_autoshoot_period" shortname="Periodic" param="DC_AUTOSHOOT_PERIOD" unit="sec"/>
<dl_setting max="255" min="0" step="1" var="dc_distance_interval" shortname="dist" param="DC_AUTOSHOOT_DISTANCE_INTERVAL" unit="meter"/>

<dl_setting max="250" min="0" step="5" module="digital_cam/dc" var="dc_survey_interval" handler="Survey" shortname="Survey-Interval"/>
<dl_setting max="90" min="5" step="5" module="digital_cam/dc" var="dc_circle_interval" handler="Circle" shortname="Circle-Interval"/>
<dl_setting max="1" min="0" step="1" var="dc_cam_tracing" shortname="Cam-Tracing"/>
</dl_settings>
</dl_settings>
</settings>
<dep>
<provides>digital_cam</provides>
</dep>
<header>
<file name="dc.h"/>
</header>
<init fun="dc_init()"/>
<makefile>
<define name="DIGITAL_CAM" />
<file name="dc.c"/>
<test firmware="rotorcraft">
<define name="DOWNLINK_TRANSPORT" value="pprz_tp"/>
<define name="DOWNLINK_DEVICE" value="uart0"/>
<define name="USE_UART0"/>
</test>
</makefile>
</module>
39 changes: 39 additions & 0 deletions conf/modules/digital_cam_gpio.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<!DOCTYPE module SYSTEM "./module.dtd">

<module name="digital_cam_gpio" dir="digital_cam">
<doc>
<description>
Digital Photo Camera Triggering (using a GPIO pin)

This module controls triggering of an attached external digital camera via one or more GPIO pins for on/off/shoot/zoom.
</description>
<section name="DIGITAL_CAM" prefix="DC_">
<define name="SHOOT_ON_BUTTON_RELEASE" description="if defined, call dc_send_shot_postion on button release instead of on push"/>
<define name="SHUTTER_GPIO" value="GPIOC,GPIO12" description="mandatory, gpio to control shutter"/>
<define name="ZOOM_IN_GPIO" value="GPIOC,GPIO2" description="optional, gpio to activate zoom in"/>
<define name="ZOOM_OUT_GPIO" value="GPIOC,GPIO5" description="optional, gpio to activate zoom out"/>
<define name="POWER_GPIO" value="GPIOB,GPIO1" description="optional, gpio to turn power on"/>
<define name="POWER_OFF_GPIO" value="GPIOC,GPIO1" description="optional, gpio to turn power off"/>
<define name="PUSH" value="gpio_set|gpio_clear" description="specifies whether to set or clear gpio to push the shutter (default: gpio_set)"/>
<define name="RELEASE" value="gpio_clear|gpio_set" description="specifies whether to set or clear gpio to release the shutter (default: gpio_clear)"/>
<define name="SHUTTER_DELAY" value="0.5" description="how long to push shutter in seconds"/>
<define name="POWER_OFF_DELAY" value="0.75" description="how long to send power off in seconds"/>
</section>
</doc>
<dep>
<depends>digital_cam_common</depends>
<conflicts>digital_cam_i2c,digital_cam_servo,digital_cam_uart,digital_cam_video,digital_cam_pprzlink</conflicts>
</dep>
<header>
<file name="gpio_cam_ctrl.h"/>
</header>
<init fun="gpio_cam_ctrl_init()"/>
<periodic fun="gpio_cam_ctrl_periodic()" freq="10" autorun="TRUE"/>
<makefile>
<file name="gpio_cam_ctrl.c"/>
<test arch="chibios">
<define name="DC_SHUTTER_GPIO" value="GPIOC,GPIO12"/>
<define name="GPIO_CAM_CTRL_PERIODIC_FREQ" value="10."/>
</test>
</makefile>
</module>
26 changes: 16 additions & 10 deletions conf/modules/digital_cam_i2c.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,38 +8,44 @@
This module controls triggering of an attached device via an I2C command.
Typically a remote microcontroller (atmega/arduino) will then use the triggering/zoom/power commands.
Using the PAYLOAD_COMMAND, all functions of the camera can be controlled.
It can trigger photos based on GPS distance, time or circle radius in both fixedwings and rotorcraft.
</description>
<configure name="ATMEGA_I2C_DEV" value="i2cX" description="select which i2c peripheral to use (default i2c0)"/>
<define name="DC_SHOOT_ON_BUTTON_RELEASE" />
<define name="DC_SHOT_SYNC_SEND" value="TRUE|FALSE" description="send DC_SHOT message when photo was taken (default: TRUE)"/>
<section name="DIGITAL_CAM" prefix="DC_">
<define name="SHOOT_ON_BUTTON_RELEASE" />
</section>
</doc>
<dep>
<conflicts>digital_cam,digital_cam_servo,digital_cam_uart,digital_cam_video</conflicts>
<provides>digital_cam</provides>
<depends>digital_cam_common</depends>
<conflicts>digital_cam_gpio,digital_cam_servo,digital_cam_uart,digital_cam_video,digital_cam_pprzlink</conflicts>
</dep>
<header>
<file name="atmega_i2c_cam_ctrl.h"/>
<file name="dc.h"/>
</header>

<init fun="atmega_i2c_cam_ctrl_init()"/>
<periodic fun="atmega_i2c_cam_ctrl_periodic()" autorun="TRUE" freq="10"/>
<event fun="atmega_i2c_cam_ctrl_event()"/>

<datalink message="PAYLOAD_COMMAND" fun="ParseCameraCommand(buf)"/>

<makefile target="ap">
<configure name="ATMEGA_I2C_DEV" default="i2c0" case="upper|lower"/>
<define name="USE_$(ATMEGA_I2C_DEV_UPPER)"/>
<define name="ATMEGA_I2C_DEV" value="$(ATMEGA_I2C_DEV_LOWER)"/>
<file name="atmega_i2c_cam_ctrl.c"/>
<file name="dc.c"/>
<test firmware="rotorcraft">
<define name="DOWNLINK_TRANSPORT" value="pprz_tp"/>
<define name="DOWNLINK_DEVICE" value="uart0"/>
<define name="USE_UART0"/>
<define name="USE_I2C0"/>
</test>
</makefile>

<makefile target="sim">
<file name="sim_i2c_cam_ctrl.c"/>
<file name="dc.c"/>
<test firmware="rotorcraft">
<define name="DOWNLINK_TRANSPORT" value="pprz_tp"/>
<define name="DOWNLINK_DEVICE" value="uart0"/>
<define name="USE_UART0"/>
</test>
</makefile>

</module>
Expand Down
42 changes: 42 additions & 0 deletions conf/modules/digital_cam_pprzlink.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<!DOCTYPE module SYSTEM "./module.dtd">

<module name="digital_cam_pprzlink" dir="digital_cam">
<doc>
<description>
Digital Photo Camera Triggering using PPRZLINK messages

Sends DC_SHOT and PAYLOAD_COMMAND messages over serial link.
Flags DC_SHOT_SYNC_SEND and DC_SHOT_EXTRA_DL are set to TRUE.

An example application can be found at: https://github.com/enacuavlab/ueye_pprzlink
This project controls a ueye camera with a NanoPI (or equivalent)
connected to the autopilot. It is possible to trigger the camera
with DC_SHOT messages (images are georeference with GPS coordinates
in Exif), but also to change the exposure and get the feedback
from the camera (useful to check the result when autoexpo is requested).
</description>
</doc>
<dep>
<depends>digital_cam_common,extra_dl</depends>
<conflicts>digital_cam_gpio,digital_cam_i2c,digital_cam_servo,digital_cam_uart,digital_cam_video</conflicts>
</dep>
<header>
<file name="pprzlink_cam_ctrl.h"/>
</header>
<init fun="pprzlink_cam_ctrl_init()"/>
<periodic fun="pprzlink_cam_ctrl_periodic()" freq="10" autorun="TRUE"/>
<datalink message="PAYLOAD_COMMAND" fun="dc_expo_cb(buf)"/>
<makefile target="ap|sim|nps">
<define name="DIGITAL_CAM"/>
<define name="DC_SHOT_SYNC_SEND"/>
<define name="DC_SHOT_EXTRA_DL"/>
<file name="pprzlink_cam_ctrl.c"/>
<test>
<define name="DOWNLINK_TRANSPORT" value="pprz_tp"/>
<define name="DOWNLINK_DEVICE" value="uart0"/>
<define name="USE_UART0"/>
<define name="EXTRA_DOWNLINK_DEVICE" value="uart1"/>
<define name="USE_UART1"/>
</test>
</makefile>
</module>
34 changes: 16 additions & 18 deletions conf/modules/digital_cam_servo.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,34 @@
Digital Photo Camera Triggering (using a servo)

This module controls triggering of an attached external digital camera via a servo channel.
It can trigger photos based on GPS distance, time or circle radius in both fixedwings and rotorcraft.
</description>
<define name="DC_SHOOT_ON_BUTTON_RELEASE" description="if defined, call dc_send_shot_postion on button release instead of on push"/>
<define name="DC_SHUTTER_SERVO" value="servo" description="mandatory, Servo to control shutter"/>
<define name="DC_ZOOM_IN_SERVO" value="servo" description="optional, Servo to activate zoom in"/>
<define name="DC_ZOOM_OUT_SERVO" value="servo" description="optional, Servo to activate zoom out"/>
<define name="DC_POWER_SERVO" value="servo" description="optional, Servo to control power"/>
<define name="DC_AUTOSHOOT_PERIOD" value="0.5" description="time period for DC_AUTOSHOOT_PERIODIC in seconds"/>
<define name="DC_AUTOSHOOT_DISTANCE_INTERVAL" value="50" description="grid in meters"/>
<section name="DIGITAL_CAM" prefix="DC_">
<define name="SHOOT_ON_BUTTON_RELEASE" description="if defined, call dc_send_shot_postion on button release instead of on push"/>
<define name="SHUTTER_SERVO" value="servo" description="mandatory, Servo to control shutter"/>
<define name="ZOOM_IN_SERVO" value="servo" description="optional, Servo to activate zoom in"/>
<define name="ZOOM_OUT_SERVO" value="servo" description="optional, Servo to activate zoom out"/>
<define name="POWER_SERVO" value="servo" description="optional, Servo to control power"/>
</section>
</doc>

<dep>
<conflicts>digital_cam,digital_cam_i2c,digital_cam_uart,digital_cam_video</conflicts>
<provides>digital_cam</provides>
<depends>digital_cam_common</depends>
<conflicts>digital_cam_gpio,digital_cam_i2c,digital_cam_uart,digital_cam_video,digital_cam_pprzlink</conflicts>
</dep>

<header>
<file name="servo_cam_ctrl.h"/>
<file name="dc.h"/>
</header>

<init fun="servo_cam_ctrl_init()"/>

<periodic fun="servo_cam_ctrl_periodic()" freq="10" autorun="TRUE"/>

<makefile target="ap|sim|nps">
<define name="DIGITAL_CAM"/>
<file name="servo_cam_ctrl.c"/>
<file name="dc.c"/>
<define name="SENSOR_SYNC_SEND" value="1"/>
<test firmware="rotorcraft">
<define name="DC_SHUTTER_SERVO" value="1"/>
<define name="DOWNLINK_TRANSPORT" value="pprz_tp"/>
<define name="DOWNLINK_DEVICE" value="uart0"/>
<define name="USE_UART0"/>
<define name="SERVO_CAM_CTRL_PERIODIC_FREQ" value="10."/>
</test>
</makefile>

</module>
3 changes: 1 addition & 2 deletions conf/modules/digital_cam_shoot_rc.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
<define name="DC_RADIO_SHOOT" value="RADIO_xxx" description="specifies the channel to be used to trigger the camera by radio transmiter"/>
</doc>
<dep>
<depends>digital_cam|digital_cam_servo|digital_cam_uart|digital_cam_i2c|digital_cam_video</depends>
<provides>digital_cam</provides>
<depends>digital_cam|digital_cam_gpio|digital_cam_servo|digital_cam_uart|digital_cam_i2c|digital_cam_video|digital_cam_pprzlink</depends>
</dep>
<header>
<file name="dc_shoot_rc.h"/>
Expand Down

0 comments on commit 6948aef

Please sign in to comment.