summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/device_status.h
blob: 8f74e21b0c6e9a161ba7ee459cdc548de0571c5c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* SPDX-License-Identifier: BSD-2-Clause */
/*
 * Copyright (C) 2019-2021, Raspberry Pi Ltd
 *
 * device_status.h - device (image sensor) status
 */
#pragma once

#include <iostream>
#include <optional>

#include <libcamera/base/utils.h>

/*
 * Definition of "device metadata" which stores things like shutter time and
 * analogue gain that downstream control algorithms will want to know.
 */

struct DeviceStatus {
	DeviceStatus()
		: shutterSpeed(std::chrono::seconds(0)), frameLength(0),
		  analogueGain(0.0)
	{
	}

	friend std::ostream &operator<<(std::ostream &out, const DeviceStatus &d);

	/* time shutter is open */
	libcamera::utils::Duration shutterSpeed;
	/* frame length given in number of lines */
	uint32_t frameLength;
	double analogueGain;
	/* 1.0/distance-in-metres, or 0 if unknown */
	std::optional<double> lensPosition;
	/* 1/f so that brightness quadruples when this doubles, or 0 if unknown */
	std::optional<double> aperture;
	/* proportional to brightness with 0 = no flash, 1 = maximum flash */
	std::optional<double> flashIntensity;
	/* Sensor reported temperature value (in degrees) */
	std::optional<double> sensorTemperature;
};
espace std; using namespace libcamera; class DelayThread : public Thread { public: DelayThread(chrono::steady_clock::duration duration) : duration_(duration) { } protected: void run() { this_thread::sleep_for(duration_); } private: chrono::steady_clock::duration duration_; }; class ThreadTest : public Test { protected: int init() { return 0; } int run() { /* Test Thread() retrieval for the main thread. */ Thread *mainThread = Thread::current(); if (!mainThread) { cout << "Thread::current() failed to main thread" << endl; return TestFail; } if (!mainThread->isRunning()) { cout << "Main thread is not running" << endl; return TestFail; } /* Test starting the main thread, the test shall not crash. */ mainThread->start(); /* Test the running state of a custom thread. */ std::unique_ptr<Thread> thread = std::make_unique<Thread>(); thread->start(); if (!thread->isRunning()) { cout << "Thread is not running after being started" << endl; return TestFail; } thread->exit(0); thread->wait(); if (thread->isRunning()) { cout << "Thread is still running after finishing" << endl; return TestFail; } /* Test waiting for completion with a timeout. */ thread = std::make_unique<DelayThread>(chrono::milliseconds(500)); thread->start(); thread->exit(0); bool timeout = !thread->wait(chrono::milliseconds(100)); if (!timeout) { cout << "Waiting for thread didn't time out" << endl; return TestFail; } timeout = !thread->wait(chrono::milliseconds(1000)); if (timeout) { cout << "Waiting for thread timed out" << endl; return TestFail; } /* Test waiting on a thread that isn't running. */ thread = std::make_unique<Thread>(); timeout = !thread->wait(); if (timeout) { cout << "Waiting for non-started thread timed out" << endl; return TestFail; } thread->start(); thread->exit(0); thread->wait(); timeout = !thread->wait(); if (timeout) { cout << "Waiting for already stopped thread timed out" << endl; return TestFail; } return TestPass; } void cleanup() { } }; TEST_REGISTER(ThreadTest)