summaryrefslogtreecommitdiff
path: root/test/threads.cpp
blob: 9a2d39dfd1065a9a8b491dea3a26d162e098b502 (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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * threads.cpp - Threads test
 */

#include <chrono>
#include <iostream>
#include <thread>

#include "thread.h"
#include "test.h"

using namespace std;
using namespace libcamera;

class InstrumentedThread : public Thread
{
public:
	InstrumentedThread(unsigned int iterations)
		: iterations_(iterations)
	{
	}

protected:
	void run()
	{
		for (unsigned int i = 0; i < iterations_; ++i) {
			this_thread::sleep_for(chrono::milliseconds(50));
		}
	}

private:
	unsigned int iterations_;
};

class ThreadTest : public Test
{
protected:
	int init()
	{
		return 0;
	}

	int run()
	{
		/* Test Thread() retrieval for the main thread. */
		Thread *thread = Thread::current();
		if (!thread) {
			cout << "Thread::current() failed to main thread"
			     << endl;
			return TestFail;
		}

		if (!thread->isRunning()) {
			cout << "Main thread is not running" << endl;
			return TestFail;
		}

		/* Test starting the main thread, the test shall not crash. */
		thread->start();

		/* Test the running state of a custom thread. */
		thread = new 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;
		}

		delete thread;

		return TestPass;
	}

	void cleanup()
	{
	}
};

TEST_REGISTER(ThreadTest)
s="hl opt">} # Locate the CSI2 and CIO2 and get the sensor format parse_pipeline() { local cio2_queue local resolution local sensor=$1 read cio2_queue bus_format sensor_size <<< $($mediactl -p | awk " /^- entity [0-9]*:/ { sensor=0; } /^- entity [0-9]*: $sensor/ { sensor=1; } /^[ \t]*(stream:0)?\[fmt:/ { if (sensor) { gsub(\".*fmt:\", \"\"); gsub(\"[] ].*\", \"\"); gsub(\"/\", \" \"); format=\$0; } } /^[ \t]*->/ { if (sensor) cio2=substr(\$3, 0, 1); } END { print cio2 \" \" format; } ") ipu3_csi2="ipu3-csi2 $cio2_queue" ipu3_capture="ipu3-cio2 $cio2_queue" sensor_width=$(echo $sensor_size | cut -d 'x' -f 1) sensor_height=$(echo $sensor_size | cut -d 'x' -f 2) echo "Using device $mdev with IPU3 CIO2 queue $cio2_queue" } # Configure the pipeline configure_pipeline() { local format="fmt:$bus_format/$sensor_size" echo "Configuring pipeline for $sensor in $format" $mediactl -r $mediactl -l "\"$sensor\":0 -> \"$ipu3_csi2\":0[1]" $mediactl -l "\"$ipu3_csi2\":1 -> \"$ipu3_capture\":0[1]" $mediactl -V "\"$sensor\":0 [$format]" $mediactl -V "\"$ipu3_csi2\":1 [$format]" } # Capture frames capture_frames() { local file_op local frame_count=$1 local ipu3_format=IPU3_${bus_format/_1X10/} local save_file=$2 if [[ $save_file -eq 1 ]]; then file_op="--file=/tmp/frame-#.bin" fi yavta -c$frame_count -n5 -I -f $ipu3_format -s $sensor_size $file_op \ $($mediactl -e "$ipu3_capture") } # Convert captured files to ppm convert_files() { local frame_count=$1 local format=${bus_format/_1X10/} local padded_width=$(expr \( $sensor_width + 49 \) / 50 \* 50) echo "Converting ${sensor_width}x${sensor_height} (${padded_width}x${sensor_height})" for i in `seq -f '%06.0f' 0 $(($frame_count - 1))`; do ipu3-unpack /tmp/frame-$i.bin /tmp/frame-$i.raw raw2pnm -x$padded_width -y$sensor_height -f$format /tmp/frame-$i.raw /tmp/frame-$i.ppm done } # Print usage message usage() { echo "Usage: $1 [options] sensor-name" echo "Supported options:" echo "-c,--count n Number of frame to capture" echo "--no-save Do not save captured frames to disk" } # Parse command line arguments frame_count=10 save_file=1 while (( "$#" )) ; do case $1 in -c|--count) frame_count=$2 shift 2 ;; --no-save) save_file=0 shift ;; -*) echo "Unsupported option $1" >&2 usage $0 exit 1 ;; *) break ;; esac done if [[ $# -ne 1 ]] ; then usage $0 exit 1 fi sensor_name=$1 sensor=$(find_sensor $sensor_name) || exit mdev=$(find_media_device) || exit mediactl="media-ctl -d $mdev" parse_pipeline $sensor configure_pipeline capture_frames $frame_count $save_file [[ $save_file -eq 1 ]] && convert_files $frame_count