Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dev/1.10.2 #89

Merged
merged 2 commits into from
Sep 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion demos/demo-android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ dependencies {
implementation 'com.jakewharton.timber:timber:5.0.1'
implementation 'io.coil-kt:coil-compose:2.2.2'
implementation "io.ktor:ktor-client-cio:2.3.9"
implementation "com.ricoh360.thetaclient:theta-client:1.10.1"
implementation "com.ricoh360.thetaclient:theta-client:1.10.2"

testImplementation 'org.junit.jupiter:junit-jupiter:5.9.0'
testImplementation "org.jetbrains.kotlinx:kotlinx-coroutines-test:$coroutines_version"
Expand Down
2 changes: 1 addition & 1 deletion demos/demo-ios/Podfile
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,5 @@ target 'SdkSample' do
use_frameworks!

# Pods for SdkSample
pod 'THETAClient', '1.10.1'
pod 'THETAClient', '1.10.2'
end
2 changes: 1 addition & 1 deletion demos/demo-react-native/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"dependencies": {
"@react-navigation/native": "^6.1.0",
"@react-navigation/native-stack": "^6.9.5",
"theta-client-react-native": "1.10.1",
"theta-client-react-native": "1.10.2",
"react": "18.2.0",
"react-native": "0.71.14",
"react-native-safe-area-context": "^4.4.1",
Expand Down
2 changes: 1 addition & 1 deletion docs/tutorial-android.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

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

Expand Down
2 changes: 1 addition & 1 deletion docs/tutorial-android.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
- Add following descriptions to the `dependencies` of your module's `build.gradle`.

```
implementation "com.ricoh360.thetaclient:theta-client:1.10.1"
implementation "com.ricoh360.thetaclient:theta-client:1.10.2"
```

- Connect the wireless LAN between THETA and the smartphone that runs on the application using this SDK.
Expand Down
2 changes: 1 addition & 1 deletion flutter/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,5 @@ dependencies {
implementation("io.ktor:ktor-serialization-kotlinx-json:2.3.9")
implementation("com.soywiz.korlibs.krypto:krypto:4.0.10")

implementation("com.ricoh360.thetaclient:theta-client:1.10.1")
implementation("com.ricoh360.thetaclient:theta-client:1.10.2")
}
4 changes: 2 additions & 2 deletions flutter/ios/theta_client_flutter.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#
Pod::Spec.new do |s|
s.name = 'theta_client_flutter'
s.version = '1.10.1'
s.version = '1.10.2'
s.summary = 'theta-client plugin project.'
s.description = <<-DESC
theta-client Flutter plugin project.
Expand All @@ -17,7 +17,7 @@ Pod::Spec.new do |s|
s.dependency 'Flutter'
s.platform = :ios, '15.0'

s.dependency 'THETAClient', '1.10.1'
s.dependency 'THETAClient', '1.10.2'

# Flutter.framework does not contain a i386 slice.
s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
Expand Down
2 changes: 1 addition & 1 deletion flutter/pubspec.yaml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: theta_client_flutter
description: THETA Client Flutter plugin project.
version: 1.10.1
version: 1.10.2
homepage:

environment:
Expand Down
2 changes: 1 addition & 1 deletion kotlin-multiplatform/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ dependencies {
dokkaPlugin("org.jetbrains.dokka:versioning-plugin:1.9.10")
}

val thetaClientVersion = "1.10.1"
val thetaClientVersion = "1.10.2"
group = "com.ricoh360.thetaclient"
version = thetaClientVersion

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@ import io.ktor.client.statement.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.utils.io.*
import io.ktor.utils.io.core.*
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.sync.Semaphore
import kotlinx.io.files.*
import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.json.Json
Expand All @@ -30,7 +32,7 @@ internal const val ALLOWED_CAPTURE_INTERVAL = 1000
/**
* Http client using [Ktor](https://jp.ktor.work/clients/index.html)
*/
@OptIn(ExperimentalSerializationApi::class) // explicitNulls
@OptIn(ExperimentalSerializationApi::class, ExperimentalCoroutinesApi::class) // explicitNulls
internal object ThetaApi {
val httpClient: HttpClient // for commands other than getLivePreview command
get() = getHttpClient()
Expand All @@ -41,7 +43,7 @@ internal object ThetaApi {
val multipartPostClient: MultipartPostClient // just for updateFirmware protcol
get() = getMultipartPostClient()

val requestSemaphore = Semaphore(1)
val requestScope = CoroutineScope(Dispatchers.Default.limitedParallelism(1))
var lastSetTimeConsumingOptionTime: Long = 0
var currentOptions = Options()

Expand All @@ -65,7 +67,7 @@ internal object ThetaApi {
suspend fun callInfoApi(
endpoint: String,
): InfoApiResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.get(getApiUrl(endpoint, InfoApi.PATH)).body()
}
}
Expand All @@ -84,7 +86,7 @@ internal object ThetaApi {
suspend fun callLicenseApi(
endpoint: String,
): HttpResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.get(getApiUrl(endpoint, LicenseApi.PATH))
}
}
Expand All @@ -103,7 +105,7 @@ internal object ThetaApi {
suspend fun callStateApi(
endpoint: String,
): StateApiResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.post(getApiUrl(endpoint, StateApi.PATH)).body()
}
}
Expand All @@ -126,7 +128,7 @@ internal object ThetaApi {
endpoint: String,
params: StatusApiParams,
): CommandApiResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
val request = StatusApiRequest(name = params.name, id = params.id)
val response = httpClient.post(getApiUrl(endpoint, StatusApi.PATH)) {
headers {
Expand Down Expand Up @@ -898,7 +900,7 @@ internal object ThetaApi {
endpoint: String,
body: T,
): HttpResponse {
return syncExecutor(requestSemaphore, ApiClient.timeout.requestTimeout) {
return syncExecutor(requestScope, ApiClient.timeout.requestTimeout) {
httpClient.post(getApiUrl(endpoint, CommandApi.PATH)) {
headers {
append("Content-Type", "application/json; charset=utf-8")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
package com.ricoh360.thetaclient

import korlibs.crypto.md5
import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout

internal const val HEX_CHARACTERS = "0123456789abcdef"
Expand All @@ -24,22 +27,22 @@ internal fun md5(data: String): String {
}

internal suspend fun <T> syncExecutor(
semaphore: Semaphore,
scope: CoroutineScope,
timeout: Long,
run: suspend () -> T,
): T {
try {
withTimeout(timeout) {
semaphore.acquire()
val deferred = CompletableDeferred<T>()
scope.launch {
runBlocking {
try {
withTimeout(timeout) {
val result = run()
deferred.complete(result)
}
} catch (e: Throwable) {
deferred.completeExceptionally(e)
}
}
} catch (e: Throwable) {
println("timeout acquire")
throw e
}
try {
val result = run()
return result
} finally {
semaphore.release()
}
return deferred.await()
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@ import com.ricoh360.thetaclient.MockApiClient
import com.ricoh360.thetaclient.ThetaRepository
import io.ktor.http.*
import io.ktor.utils.io.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.joinAll
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.runTest
import kotlin.test.*

@OptIn(ExperimentalCoroutinesApi::class)
class ThetaRepositoryTest {
private val endpoint = "http://192.168.1.1:80/"

Expand Down Expand Up @@ -793,15 +791,20 @@ class ThetaRepositoryTest {

@Test
fun callSingleRequestTimeoutTest() = runBlocking {
var counter = 0
val jsonString = Resource("src/commonTest/resources/info/info_z1.json").readText()
MockApiClient.onRequest = { _ ->
counter += 1
runBlocking {
delay(500)
val jsonInfo = Resource("src/commonTest/resources/info/info_z1.json").readText()
val jsonState = Resource("src/commonTest/resources/state/state_z1.json").readText()
MockApiClient.onRequest = { request ->
when (request.url.encodedPath) {
"/osc/info" -> ByteReadChannel(jsonInfo)
"/osc/state" -> {
runBlocking {
delay(500)
}
ByteReadChannel(jsonState)
}

else -> throw Exception("Error")
}
counter -= 1
ByteReadChannel(jsonString)
}

val timeout = ThetaRepository.Timeout(
Expand All @@ -812,10 +815,15 @@ class ThetaRepositoryTest {
val apiJobsList = listOf(
launch {
thetaRepository.getThetaInfo()
try {
thetaRepository.getThetaInfo()
} catch (e: ThetaRepository.NotConnectedException) {
assertTrue(false)
}
},
launch {
try {
thetaRepository.getThetaInfo()
thetaRepository.getThetaState()
assertTrue(false)
} catch (e: ThetaRepository.NotConnectedException) {
assertTrue((e.message?.indexOf("time", 0, true) ?: -1) >= 0, "timeout error")
Expand Down
2 changes: 1 addition & 1 deletion react-native/android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ dependencies {
implementation "com.facebook.react:react-native:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3"
implementation "com.ricoh360.thetaclient:theta-client:1.10.1"
implementation "com.ricoh360.thetaclient:theta-client:1.10.2"

// From node_modules
}
Expand Down
2 changes: 1 addition & 1 deletion react-native/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "theta-client-react-native",
"version": "1.10.1",
"version": "1.10.2",
"description": "This library provides a way to control RICOH THETA using.",
"main": "lib/commonjs/index",
"module": "lib/module/index",
Expand Down
2 changes: 1 addition & 1 deletion react-native/theta-client-react-native.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Pod::Spec.new do |s|
s.source_files = "ios/**/*.{h,m,mm,swift}"

s.dependency "React-Core"
s.dependency "THETAClient", "1.10.1"
s.dependency "THETAClient", "1.10.2"

# Don't install the dependencies when we run `pod install` in the old architecture.
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
Expand Down
Loading