Skip to content

Commit

Permalink
RN verification tool.
Browse files Browse the repository at this point in the history
* Convert obj-c to swift

* Fix react native test

* Fix live preview

* Improve live preview frame data

* Add ConvertUtil

* Implement initialize

* Implement getThetaModel

* Implement getThetaInfo

* Implement time shift capture

* Implement photo capture

* Implement video capture

* [RN iOS]convert getThetaState、listFiles、deleteFiles、deleteAllFiles、deleteAllImageFiles、deleteAllVideoFiles.

* [RN ios]change string value to const.

* Implement getOptions

* Fix when storage in listFiles is nil

* Implement setOptions

* Implement setBluetoothDevice

* Implement PluginOrders

* Implement getPluginLicense

* Fix typo

* Implement listPlugins

* Improve isInitialized

* Implement plugin control

* Implement my setting

* Implement access point

* Implement finishWlan

* Implement convert video

* Implement the remaining functions

* Refactor

* Improve code format

* Fix param Int32 crash to react native

* Fix typo to isInitialized

* Improve example

* Implement rn example options

* Fix lint

* Add option default value

* Improve list item view

* Add commands screen

* Add option colorTemperature

* Add ui toggle switch

* Improve video convert screen

* Fix example package

* Fix unit test to buildTimeShiftCapture

* Add list files view

* improve the appearance to list

* Add listFIles screen

* Improve refresh file list

* [private]add photo capture screen to RN example. 

* [RN example]add photo capture screen.

* [RN example]add common settings to photoCapture screen.

* [RN example] add gpsInfo to photoCapture screen. lint code.

* [RN example] fixed feedback.

* [RN example] fixed feedback.

* Add gpsInfo label

* [RN example] create common option component for capture. changed layout for photoCapture screen. make editable of number & string input can be set.

* Fix set photo capture options

* Fix set colorTemperature

* Fix edit gpsInfo

* [RN example] cannot take photo when theta is not initialized.

* [RN example] catch not inited error at photo capture.

---------

Co-authored-by: osakila <[email protected]>

* Add delete files screen

* Add stopSelfTimer to photo capture

* Add getMetadata screen

* Add get info screen

* Fix set options gpsInfo float value

* [private]add video capture screen to RN example

* [private]add video capture screen to RN example.

* Fix video capture screen

* Cange video capture callback

* Implement video capture test to kmm

* Implement video capture test to rn

* Implement video capture test to flutter

* Fix comment

* Fix tutorial to video capture

* Improve video capture I/F to flutter

* Fix tutorial to video capture

* Add buildToolsVersion to rn example

* Add gradlew to rn example

* Add gradlew to rn example

* [RN example] add options to option screen.

* [private]add time-shift capture screen to RN example.

* [RN example]add time-shift capture screen.

* [RN example] fixed feedback.

* [RN example] fixed feedback again.

* [RN example] fixed time-shift screen default message.

* [RN example] fixed time-shift screen default value.

* [RN example] fixed feedback.

---------

Co-authored-by: osakila <[email protected]>

* [private]Improve example menu

* Improve menu layout

* Improve capture menu

* Fix menu key error

* [private]Change RN example name to verification tool

* Change example to verification-tool for ios

* Change example to verification-tool for android

* Improve check video capture state

* fixed and format tutorial.

* [private]Fix video capture for SC2 self-timer

* Fix video capture for self timer

* Fix video capture unit test

* Add dummy workflow

* formatted code for 1.4.0.

* format flutter code.

* format kmm code.

* format rn code.

* format swift code.

---------

Co-authored-by: osakila <[email protected]>
  • Loading branch information
LassicYM and osakila authored Sep 13, 2023
1 parent d57afa6 commit 3643ec1
Show file tree
Hide file tree
Showing 272 changed files with 24,064 additions and 11,744 deletions.
11 changes: 11 additions & 0 deletions .github/workflows/dummy.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: Dummy for test

on:
workflow_dispatch:

jobs:
dummy:
if: ${{ false }}
runs-on: ubuntu-latest
steps:
- run: ""
27 changes: 19 additions & 8 deletions demos/demo-flutter/lib/capture_video_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,9 @@ class _CaptureVideoScreen extends State<CaptureVideoScreen> with WidgetsBindingO
}

void startVideoCapture() {
if (videoCapture == null) {
return;
}
if (shooting) {
debugPrint('already shooting');
return;
Expand All @@ -195,27 +198,34 @@ class _CaptureVideoScreen extends State<CaptureVideoScreen> with WidgetsBindingO
// Stops while shooting is in progress
stopLivePreview();

videoCapturing = videoCapture!.startCapture((fileUrl) {

videoCapturing = videoCapture?.startCapture((fileUrl) {
setState(() {
shooting = false;
});
debugPrint('capture video: $fileUrl');
if (!mounted) return;

final uri = Uri.parse(fileUrl);
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => VideoScreen(
name: uri.pathSegments.last,
fileUrl: fileUrl,
if (fileUrl != null) {
final uri = Uri.parse(fileUrl);
Navigator.of(context).push(
MaterialPageRoute(builder: (_) => VideoScreen(
name: uri.pathSegments.last,
fileUrl: fileUrl,
)
)
)
).then((value) => startLivePreview());
).then((value) => startLivePreview());
}
}, (exception) {
setState(() {
shooting = false;
});
startLivePreview();
debugPrint(exception.toString());

}, onStopFailed: (exception) {
debugPrint(exception.toString());
MessageBox.show(context, 'Error. stopCapture.\n$exception');
});
}

Expand All @@ -224,6 +234,7 @@ class _CaptureVideoScreen extends State<CaptureVideoScreen> with WidgetsBindingO
debugPrint('Not start capture.');
return;
}
debugPrint("stopVideoCapture");
videoCapturing!.stopCapture();
}
}
222 changes: 116 additions & 106 deletions docs/tutorial-android.ja.md
Original file line number Diff line number Diff line change
@@ -1,42 +1,45 @@
# RICOH360 THETA clientチュートリアル
# RICOH360 THETA client チュートリアル

## 事前準備

* モジュールの`build.gradle``dependencies`に次を追加します。
- モジュールの`build.gradle``dependencies`に次を追加します。
```
implementation "com.ricoh360.thetaclient:theta-client:1.0.0"
```
* 本SDKを使用したアプリケーションが動作するスマートフォンとTHETAを無線LAN接続しておきます
- 本 SDK を使用したアプリケーションが動作するスマートフォンと THETA を無線 LAN 接続しておきます

## THETA clientのインスタンス作成
## THETA client のインスタンス作成

インスタンス作成時にカメラの日時設定、言語設定、シャッター音量設定、スリープまでの時間設定、電源オフまでの時間設定を行うこともできます。

* 言語設定(THETA S, THETA SCでは指定しても無視される)
* “en-US”
* “en-GB”
* “ja”
* “fr”
* “de”
* “zh-TW”
* “zh-CN”
* “it”
* “ko”
- 言語設定(THETA S, THETA SC では指定しても無視される)

* 日時設定
* YYYY:MM:DD HH:MM:SS+HH:MMの形式
- “en-US”
- “en-GB”
- “ja”
- “fr”
- “de”
- “zh-TW”
- “zh-CN”
- “it”
- “ko”

* スリープモードに入るまでの時間(分)
* 自動オフしない, 3分, 5分, 7分, 10分
- 日時設定

* スリープから自動電源オフまでの時間(分)
* 自動オフしない, 5分, 10分, 15分, 30分
- YYYY:MM:DD HH:MM:SS+HH:MM の形式

* シャッター音
* 0〜100
- スリープモードに入るまでの時間(分)

- 自動オフしない, 3 分, 5 分, 7 分, 10 分

``` kotlin
- スリープから自動電源オフまでの時間(分)

- 自動オフしない, 5 分, 10 分, 15 分, 30 分

- シャッター音
- 0〜100

```kotlin
import com.ricoh360.pf.theta.ThetaRepository

val thetaUrl = "192.168.1.1:80"
Expand All @@ -53,7 +56,7 @@ thetaRepository = ThetaRepository.newInstance(thetaUrl, thetaConfig)

まず`PhotoCapture.Builder`を使って撮影設定を行い、`PhotoCapture`オブジェクトを生成します。

``` kotlin
```kotlin
class TakenCallback : PhotoCapture.TakePictureCallback {
override fun onSuccess(fileUrl: String) {
// get JPEG file
Expand All @@ -79,159 +82,166 @@ thetaRepository.getPhotoCaptureBuilder()

### 静止画撮影時に設定できる項目

* 露出補正
* -2.0, -1.7, -1.3, -1.0, -0.7, -0.3, 0.0, 0.3, 0.7, 1.0, 1.3, 1.7, 2.0
* セルフタイマー
* 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
* 解像度
- 露出補正
- -2.0, -1.7, -1.3, -1.0, -0.7, -0.3, 0.0, 0.3, 0.7, 1.0, 1.3, 1.7, 2.0
- セルフタイマー
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
- 解像度

| 機種 | 解像度指定 | 横(pixel) | 縦(pixel) |
| ------------------- | ---------- | --------- | --------- |
| THETA X | IMAGE_11K | 11,008 | 5,504 |
| THETA X | IMAGE_5_5K | 5,504 | 2,752 |
| THETA Z1 | IMAGE_6_7K | 6,720 | 3,360 |
| THETA S, SC, SC2, V | IMAGE_5K | 5,376 | 2,688 |

| 機種 | 解像度指定 | 横(pixel) | 縦(pixel) |
| ---- | --------- |-- | -- |
| THETA X | IMAGE_11K | 11,008 | 5,504 |
| THETA X | IMAGE_5_5K | 5,504 | 2,752 |
| THETA Z1 | IMAGE_6_7K | 6,720 | 3,360 |
| THETA S, SC, SC2, V | IMAGE_5K | 5,376 | 2,688 |
- 画像処理

* 画像処理
* なし
* ノイズ軽減
* HDR
- なし
- ノイズ軽減
- HDR

* GPSオン/オフ (THETA X以外は指定しても無視される)
* ON
* OFF
- GPS オン/オフ (THETA X 以外は指定しても無視される)

* ISO上限 (THETA V ファームウェア v2.50.1以前、THETA S、THETA SCでは指定しても無視される)
* 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200
- ON
- OFF

- ISO 上限 (THETA V ファームウェア v2.50.1 以前、THETA S、THETA SC では指定しても無視される)
- 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200

## 動画を撮影する

まず`VideoCapture.Builder`を使って撮影設定を行い、`VideoCapture`オブジェクトを生成します。

``` kotlin
```kotlin
val videoCapture: VideoCapture = VideoCapture.Builder()
.setAutoIsoUpperLimit(IsoEnum.ISO_800)
.setFileFormat(VideoFileFormatEnum.VIDEO_5_7K_30F)
.build()
```

上の例ではISO感度の最大値を800に、解像度を5.7Kに設定しています
上の例では ISO 感度の最大値を 800 に、解像度を 5.7K に設定しています

Theta SとTheta SC以外ではプレビューを表示できます。表示方法は[プレビューを表示する](#プレビューを表示する)をご覧ください
Theta S と Theta SC 以外ではプレビューを表示できます。表示方法は[プレビューを表示する](#プレビューを表示する)をご覧ください

次に`VideoCapture.startCapture()`を呼んで動画の撮影を開始します。引数にはMP4ファイルをHTTP GETするコールバック関数を渡します
次に`VideoCapture.startCapture()`を呼んで動画の撮影を開始します。引数には MP4 ファイルを HTTP GET するコールバック関数を渡します

``` kotlin
```kotlin
class TakenCallback : VideoCapture.StartCaptureCallback {
override fun onSuccess(fileUrl: String) {
override fun onCaptureCompleted(fileUrl: String?) {
// get MP4 file
}
override fun onError(exception: ThetaRepository.ThetaRepositoryException) {
override fun onCaptureFailed(exception: ThetaRepository.ThetaRepositoryException) {
// error processing
}
override fun onStopFailed(exception: ThetaRepository.ThetaRepositoryException) {
// error stopCapture
}
}

val videoCapturing: VideoCapturing = videoCapture.startCapture(TakenCallback())
```

次に`VideoCapturing.stopCapture()`を呼んで動画の撮影を終了します。撮影終了後、MP4ファイルの生成が完了すると`startCapture()`に渡したコールバック関数が呼ばれます。
次に`VideoCapturing.stopCapture()`を呼んで動画の撮影を終了します。撮影終了後、MP4 ファイルの生成が完了すると`startCapture()`に渡したコールバック関数が呼ばれます。

``` kotlin
```kotlin
videoCapturing.stopCapture()
```

### 動画撮影時に設定できる項目

* 解像度
- 解像度

| 機種 | 解像度指定 | 横(pixel) | 縦(pixel) |
| ---- | --------- |-- | -- |
| THETA X | VIDEO_5_7K_30F | 5,760 | 2,880 |
| THETA X | VIDEO_4K_30F | 3,840 | 1,920 |
| THETA X | VIDEO_2K_30F | 1,920 | 960 |
| THETA Z1 | VIDEO_4K | 3,840 | 1,920 |
| THETA Z1 | VIDEO_2K | 1,920 | 960 |
| THETA SC2, V | VIDEO_4K | 3,840 | 1,920 |
| THETA SC2, V | VIDEO_2K | 1,920 | 960 |
| THETA S, SC | VIDEO_FULL_HD | 1,920 | 1,080 |
| 機種 | 解像度指定 | 横(pixel) | 縦(pixel) |
| ------------ | -------------- | --------- | --------- |
| THETA X | VIDEO_5_7K_30F | 5,760 | 2,880 |
| THETA X | VIDEO_4K_30F | 3,840 | 1,920 |
| THETA X | VIDEO_2K_30F | 1,920 | 960 |
| THETA Z1 | VIDEO_4K | 3,840 | 1,920 |
| THETA Z1 | VIDEO_2K | 1,920 | 960 |
| THETA SC2, V | VIDEO_4K | 3,840 | 1,920 |
| THETA SC2, V | VIDEO_2K | 1,920 | 960 |
| THETA S, SC | VIDEO_FULL_HD | 1,920 | 1,080 |

* 最長撮影時間(分)
* 5
* 25
- 最長撮影時間(分)

* ISO上限 (THETA V ファームウェア v2.50.1以前、THETA S、THETA SCでは指定しても無視される)
* 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200
- 5
- 25

- ISO 上限 (THETA V ファームウェア v2.50.1 以前、THETA S、THETA SC では指定しても無視される)
- 200, 250, 320, 400, 500, 640, 800, 1000, 1250, 1600, 2000, 2500, 3200

## プレビューを表示する

プレビューはequirectangular形式のmotion JPEGです。
プレビューは equirectangular 形式の motion JPEG です。

| 機種 | 横(pixel) | 縦(pixel) | フレームレート(fps) | 備考 |
| ----------- | --------- | --------- | ------------------- | --------------------------- |
| THETA X | 1024 | 512 | 30 | |
| THETA Z1 | 1024 | 512 | 30 | |
| THETA V | 1024 | 512 | 30 | ファームウェア v2.21.1 以降 |
| THETA V | 1024 | 512 | 8 | ファームウェア v2.20.1 以前 |
| THETA SC2 | 1024 | 512 | 30 | |
| THETA S, SC | 640 | 320 | 10 | |

| 機種 | 横(pixel) | 縦(pixel) | フレームレート(fps) | 備考 |
| ---- | -- | -- | ------------ | ---- |
| THETA X | 1024 | 512 | 30 | |
| THETA Z1 | 1024 | 512 | 30 | |
| THETA V | 1024 | 512 | 30 | ファームウェア v2.21.1以降 |
| THETA V | 1024 | 512 | 8 | ファームウェア v2.20.1以前 |
| THETA SC2 | 1024 | 512 | 30 ||
| THETA S, SC | 640 | 320 | 10 | |
`ThetaRepository.getLivePreview()`を呼ぶと、`Flow<io.ktor.utils.io.core.ByteReadPacket>`が返るので、そこか各フレームの JPEG を取得します。

`ThetaRepository.getLivePreview()`を呼ぶと、`Flow<io.ktor.utils.io.core.ByteReadPacket>`が返るので、そこか各フレームのJPEGを取得します。
```kotlin
import io.ktor.utils.io.core.ByteReadPacket

thetaRepository.getLivePreview()
.collect { byteReadPacket ->
if (isActive) {
byteReadPacket.inputStream().use {
// ストリームをJPEGとして表示
// Displaying the stream as JPEG
}
}
byteReadPacket.release()
}
```

## THETA 内の静止画・動画を一覧する

## THETA内の静止画・動画を一覧する
THETA内の静止画(JPEGファイル)や動画(MP4ファイル)の一覧は`ThetaRepository.listFiles(fileType, startPosition, entryCount)`を使って取得できます。
THETA 内の静止画(JPEG ファイル)や動画(MP4 ファイル)の一覧は`ThetaRepository.listFiles(fileType, startPosition, entryCount)`を使って取得できます。
`fileType``ThetaRepository.FileTypeEnum`型で内容は以下の通りです。
`ThetaRepository.listFiles()`の戻り値型は`ThetaRepository.ThetaFiles`で、`ThetaFiles`のプロパティ`fileList` がTHETA内のファイル一覧です
`ThetaRepository.listFiles()`の戻り値型は`ThetaRepository.ThetaFiles`で、`ThetaFiles`のプロパティ`fileList` が THETA 内のファイル一覧です
`fileList``ThetaRepository.FileInfo`のリストです。

JPEGファイル、MP4ファイルは`FileInfo.fileUrl`サムネイルのJPEGファイルは`FileInfo.thumbnailUrl`の値を参照し、HTTP GETします
JPEG ファイル、MP4 ファイルは`FileInfo.fileUrl`サムネイルの JPEG ファイルは`FileInfo.thumbnailUrl`の値を参照し、HTTP GET します

* ThetaRepository.FileTypeEnum
- ThetaRepository.FileTypeEnum

||内容|
|---|---|
|IMAGE|静止画(JPEGファイル)を一覧|
|VIDEO|動画(MP4ファイル)を一覧|
|ALL|全てのファイルを一覧|
|| 内容 |
| ----- | ----------------------------- |
| IMAGE | 静止画(JPEG ファイル)を一覧 |
| VIDEO | 動画(MP4 ファイル)を一覧 |
| ALL | 全てのファイルを一覧 |

* ThetaRepository.ThetaFiles
- ThetaRepository.ThetaFiles

|Property name|Type|Contents|
|---|---|---|
|fileList|List\<FileInfo\>|THETA内のファイル一覧|
|totalEntries|Int| THETA内のファイル数 ([api spec](https://github.com/ricohapi/theta-api-specs/blob/main/theta-web-api-v2.1/commands/camera.list_files.md)参照)
| Property name | Type | Contents |
| ------------- | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| fileList | List\<FileInfo\> | THETA 内のファイル一覧 |
| totalEntries | Int | THETA 内のファイル数 ([api spec](https://github.com/ricohapi/theta-api-specs/blob/main/theta-web-api-v2.1/commands/camera.list_files.md)参照) |

* ThetaRepository.FileInfo
- ThetaRepository.FileInfo

|プロパティ名||内容|
|---|---|---|
|name|String|ファイル名を表します|
|size|Long|ファイルサイズ(バイト数)を表します|
|dateTime|String|撮影日時(YYYY:MM:DD HH:MM:SS)を表します|
|fileUrl|String|ファイルのURLを表します|
|thumbnailUrl|String|サムネールのURLを表します|
| プロパティ名 || 内容 |
| ------------ | ------ | ----------------------------------------- |
| name | String | ファイル名を表します |
| size | Long | ファイルサイズ(バイト数)を表します |
| dateTime | String | 撮影日時(YYYY:MM:DD HH:MM:SS)を表します |
| fileUrl | String | ファイルの URL を表します |
| thumbnailUrl | String | サムネールの URL を表します |

## THETAの情報を取得する
## THETA の情報を取得する

`ThetaRepository.getThetaInfo()`を呼びます。

## THETAの状態を取得する
## THETA の状態を取得する

`ThetaRepository.getThetaState()`を呼びます。

## THETAをリセットする
## THETA をリセットする

`ThetaRepository.reset()`を呼びます。
Loading

0 comments on commit 3643ec1

Please sign in to comment.