mirror of
https://bitbucket.org/librepilot/librepilot.git
synced 2025-02-21 11:54:15 +01:00
LP-385 - Manage time/distance trigger, picture trigger pulse duration
This commit is contained in:
parent
3bd8d48068
commit
b356408e16
@ -59,6 +59,7 @@ static struct CameraControl_data {
|
|||||||
CameraStatus outputStatus;
|
CameraStatus outputStatus;
|
||||||
CameraStatus lastOutputStatus;
|
CameraStatus lastOutputStatus;
|
||||||
CameraStatus manualInput;
|
CameraStatus manualInput;
|
||||||
|
CameraStatus lastManualInput;
|
||||||
bool autoTriggerEnabled;
|
bool autoTriggerEnabled;
|
||||||
} *ccd;
|
} *ccd;
|
||||||
|
|
||||||
@ -94,6 +95,7 @@ int32_t CameraControlInitialize(void)
|
|||||||
CameraDesiredInitialize();
|
CameraDesiredInitialize();
|
||||||
CameraControlSettingsInitialize();
|
CameraControlSettingsInitialize();
|
||||||
CameraControlSettingsConnectCallback(SettingsUpdateCb);
|
CameraControlSettingsConnectCallback(SettingsUpdateCb);
|
||||||
|
|
||||||
SettingsUpdateCb(NULL);
|
SettingsUpdateCb(NULL);
|
||||||
|
|
||||||
// init output:
|
// init output:
|
||||||
@ -119,28 +121,55 @@ MODULE_INITCALL(CameraControlInitialize, CameraControlStart);
|
|||||||
|
|
||||||
static void CameraControlTask()
|
static void CameraControlTask()
|
||||||
{
|
{
|
||||||
|
bool trigger = false;
|
||||||
|
PositionStateData pos;
|
||||||
|
|
||||||
if (checkActivation()) {
|
if (checkActivation()) {
|
||||||
// Manual override
|
if (ccd->manualInput != ccd->lastManualInput && ccd->manualInput != CAMERASTATUS_Idle) {
|
||||||
if (ccd->manualInput != CAMERASTATUS_Idle) {
|
// Manual override
|
||||||
ccd->outputStatus = ccd->manualInput;
|
ccd->outputStatus = ccd->manualInput;
|
||||||
ccd->activity.Reason = CAMERACONTROLACTIVITY_REASON_MANUAL;
|
ccd->activity.Reason = CAMERACONTROLACTIVITY_REASON_MANUAL;
|
||||||
} else {
|
} else {
|
||||||
if (ccd->autoTriggerEnabled) {
|
if (ccd->autoTriggerEnabled) {
|
||||||
ccd->activity.Reason = CAMERACONTROLACTIVITY_REASON_AUTOTIME;
|
// check trigger conditions
|
||||||
ccd->outputStatus = CAMERASTATUS_Shot;
|
if (ccd->settings.TimeInterval > 0) {
|
||||||
|
if (PIOS_DELAY_DiffuS(ccd->lastTriggerTimeRaw) > ccd->settings.TimeInterval * (1000 * 1000)) {
|
||||||
|
trigger = true;
|
||||||
|
ccd->activity.Reason = CAMERACONTROLACTIVITY_REASON_AUTOTIME;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ccd->settings.SpaceInterval > 0) {
|
||||||
|
PositionStateGet(&pos);
|
||||||
|
float dn = pos.North - ccd->lastTriggerNEDPosition[0];
|
||||||
|
float de = pos.East - ccd->lastTriggerNEDPosition[1];
|
||||||
|
float distance = sqrtf((dn * dn) + (de * de));
|
||||||
|
ccd->activity.TriggerMilliSecond = (int16_t)distance * 10.0f;
|
||||||
|
if (distance > ccd->settings.SpaceInterval) {
|
||||||
|
trigger = true;
|
||||||
|
ccd->activity.Reason = CAMERACONTROLACTIVITY_REASON_AUTODISTANCE;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (trigger) {
|
||||||
|
ccd->outputStatus = CAMERASTATUS_Shot;
|
||||||
|
ccd->lastTriggerTimeRaw = PIOS_DELAY_GetRaw();
|
||||||
|
ccd->lastTriggerNEDPosition[0] = pos.North;
|
||||||
|
ccd->lastTriggerNEDPosition[1] = pos.East;
|
||||||
|
ccd->lastTriggerNEDPosition[2] = pos.Down;
|
||||||
} else {
|
} else {
|
||||||
ccd->outputStatus = CAMERASTATUS_Idle;
|
ccd->outputStatus = CAMERASTATUS_Idle;
|
||||||
|
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateOutput();
|
ccd->lastManualInput = ccd->manualInput;
|
||||||
PublishActivity();
|
PublishActivity();
|
||||||
ccd->lastOutputStatus = ccd->outputStatus;
|
UpdateOutput();
|
||||||
PIOS_CALLBACKSCHEDULER_Schedule(ccd->callbackHandle, CALLBACK_STD_PERIOD, CALLBACK_UPDATEMODE_SOONER);
|
PIOS_CALLBACKSCHEDULER_Schedule(ccd->callbackHandle, CALLBACK_STD_PERIOD, CALLBACK_UPDATEMODE_SOONER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void SettingsUpdateCb(__attribute__((unused)) UAVObjEvent *ev)
|
static void SettingsUpdateCb(__attribute__((unused)) UAVObjEvent *ev)
|
||||||
{
|
{
|
||||||
CameraControlSettingsGet(&ccd->settings);
|
CameraControlSettingsGet(&ccd->settings);
|
||||||
@ -203,7 +232,14 @@ static void UpdateOutput()
|
|||||||
if (ccd->outputStatus != ccd->lastOutputStatus) {
|
if (ccd->outputStatus != ccd->lastOutputStatus) {
|
||||||
switch (ccd->outputStatus) {
|
switch (ccd->outputStatus) {
|
||||||
case CAMERASTATUS_Idle:
|
case CAMERASTATUS_Idle:
|
||||||
CameraDesiredTriggerSet(&ccd->settings.OutputValues.Idle);
|
if (CAMERASTATUS_Shot == ccd->lastOutputStatus) {
|
||||||
|
if (PIOS_DELAY_DiffuS(ccd->lastTriggerTimeRaw) > ccd->settings.TriggerPulseWidth * 1000) {
|
||||||
|
CameraDesiredTriggerSet(&ccd->settings.OutputValues.Idle);
|
||||||
|
} else {
|
||||||
|
// skip updating lastOutputStatus until TriggerPulseWidth elapsed
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case CAMERASTATUS_Shot:
|
case CAMERASTATUS_Shot:
|
||||||
CameraDesiredTriggerSet(&ccd->settings.OutputValues.Shot);
|
CameraDesiredTriggerSet(&ccd->settings.OutputValues.Shot);
|
||||||
@ -213,6 +249,7 @@ static void UpdateOutput()
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ccd->lastOutputStatus = ccd->outputStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PublishActivity()
|
static void PublishActivity()
|
||||||
@ -223,7 +260,7 @@ static void PublishActivity()
|
|||||||
if (ccd->lastOutputStatus == CAMERASTATUS_Video) {
|
if (ccd->lastOutputStatus == CAMERASTATUS_Video) {
|
||||||
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_STOPVIDEO;
|
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_STOPVIDEO;
|
||||||
} else {
|
} else {
|
||||||
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_NONE;
|
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_IDLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CAMERASTATUS_Shot:
|
case CAMERASTATUS_Shot:
|
||||||
@ -233,11 +270,12 @@ static void PublishActivity()
|
|||||||
if (ccd->lastOutputStatus != CAMERASTATUS_Video) {
|
if (ccd->lastOutputStatus != CAMERASTATUS_Video) {
|
||||||
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_STARTVIDEO;
|
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_STARTVIDEO;
|
||||||
} else {
|
} else {
|
||||||
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_NONE;
|
ccd->activity.Activity = CAMERACONTROLACTIVITY_ACTIVITY_IDLE;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (ccd->activity.Activity != CAMERACONTROLACTIVITY_ACTIVITY_NONE) {
|
if (ccd->activity.Activity != CAMERACONTROLACTIVITY_ACTIVITY_IDLE
|
||||||
|
|| ccd->lastOutputStatus != CAMERASTATUS_Shot) {
|
||||||
FillActivityInfo();
|
FillActivityInfo();
|
||||||
CameraControlActivitySet(&ccd->activity);
|
CameraControlActivitySet(&ccd->activity);
|
||||||
}
|
}
|
||||||
@ -251,9 +289,9 @@ static void FillActivityInfo()
|
|||||||
PositionStateData position;
|
PositionStateData position;
|
||||||
PositionStateGet(&position);
|
PositionStateGet(&position);
|
||||||
|
|
||||||
activity->Latitude = position.North;
|
activity->Latitude = position.North * 1e3f;
|
||||||
activity->Longitude = position.East;
|
activity->Longitude = position.East * 1e3f;
|
||||||
activity->Altitude = -position.Down;
|
activity->Altitude = -position.Down * 1e3f;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
GPSTimeData time;
|
GPSTimeData time;
|
||||||
@ -267,7 +305,8 @@ static void FillActivityInfo()
|
|||||||
activity->TriggerSecond = time.Second;
|
activity->TriggerSecond = time.Second;
|
||||||
activity->TriggerMilliSecond = time.MilliSecond;
|
activity->TriggerMilliSecond = time.MilliSecond;
|
||||||
}
|
}
|
||||||
activity->SysTS = PIOS_DELAY_GetuS();
|
|
||||||
|
activity->SysTS = PIOS_DELAY_GetuS();
|
||||||
{
|
{
|
||||||
AttitudeStateData attitude;
|
AttitudeStateData attitude;
|
||||||
AttitudeStateGet(&attitude);
|
AttitudeStateGet(&attitude);
|
||||||
@ -276,5 +315,4 @@ static void FillActivityInfo()
|
|||||||
activity->Pitch = attitude.Pitch;
|
activity->Pitch = attitude.Pitch;
|
||||||
activity->Yaw = attitude.Yaw;
|
activity->Yaw = attitude.Yaw;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<field name="TriggerMinute" units="" type="int8" elements="1"/>
|
<field name="TriggerMinute" units="" type="int8" elements="1"/>
|
||||||
<field name="TriggerSecond" units="" type="int8" elements="1"/>
|
<field name="TriggerSecond" units="" type="int8" elements="1"/>
|
||||||
<field name="TriggerMilliSecond" units="" type="int16" elements="1"/>
|
<field name="TriggerMilliSecond" units="" type="int16" elements="1"/>
|
||||||
<field name="Activity" units="" type="enum" elements="1" options="None,TriggerPicture,StartVideo,StopVideo" default="None"/>
|
<field name="Activity" units="" type="enum" elements="1" options="Idle,TriggerPicture,StartVideo,StopVideo" default="None"/>
|
||||||
<field name="Reason" units="" type="enum" elements="1" options="Manual,AutoDistance,AutoTime" default="Manual"/>
|
<field name="Reason" units="" type="enum" elements="1" options="Manual,AutoDistance,AutoTime" default="Manual"/>
|
||||||
<field name="SysTS" units="us" type="uint32" elements="1"/>
|
<field name="SysTS" units="us" type="uint32" elements="1"/>
|
||||||
<access gcs="readwrite" flight="readwrite"/>
|
<access gcs="readwrite" flight="readwrite"/>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<field name="AutoTriggerMode" units="mode" type="enum" elements="1" options="Disabled,WhenArmed,Always,Input,Mission" defaultvalue="WhenArmed"/>
|
<field name="AutoTriggerMode" units="mode" type="enum" elements="1" options="Disabled,WhenArmed,Always,Input,Mission" defaultvalue="WhenArmed"/>
|
||||||
<field name="OutputValues" units="%" type="float" elementnames="Idle,Shot,Video" defaultvalue="0,-1,1" />
|
<field name="OutputValues" units="%" type="float" elementnames="Idle,Shot,Video" defaultvalue="0,-1,1" />
|
||||||
<field name="InputValues" units="%" type="float" elementnames="Idle,Shot,Video" defaultvalue="0,-1,1" />
|
<field name="InputValues" units="%" type="float" elementnames="Idle,Shot,Video" defaultvalue="0,-1,1" />
|
||||||
<field name="TriggerResponseTime" units="ms" type="uint8" elements="1" defaultvalue="0"/>
|
<field name="TriggerPulseWidth" units="ms" type="uint8" elements="1" defaultvalue="50"/>
|
||||||
<field name="TimeInterval" units="s" type="float" elements="1" defaultvalue="0"/>
|
<field name="TimeInterval" units="s" type="float" elements="1" defaultvalue="0"/>
|
||||||
<field name="SpaceInterval" units="m" type="float" elements="1" defaultvalue="0"/>
|
<field name="SpaceInterval" units="m" type="float" elements="1" defaultvalue="0"/>
|
||||||
<access gcs="readwrite" flight="readwrite"/>
|
<access gcs="readwrite" flight="readwrite"/>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user