OSDN Git Service

ライブビューの受信間隔もパラメータ化。
[gokigen/FujiCam.git] / app / src / main / java / net / osdn / gokigen / cameratest / fuji / FujiStreamReceiver.java
index 3bfd4b2..17beb24 100644 (file)
@@ -1,29 +1,59 @@
 package net.osdn.gokigen.cameratest.fuji;
 
+import android.app.Activity;
+import android.content.SharedPreferences;
 import android.util.Log;
 import androidx.annotation.NonNull;
+import androidx.preference.PreferenceManager;
+
 import java.io.InputStream;
 import java.net.Socket;
 
+import static net.osdn.gokigen.cameratest.fuji.preference.IPreferencePropertyAccessor.FUJIX_LIVEVIEW_WAIT;
+import static net.osdn.gokigen.cameratest.fuji.preference.IPreferencePropertyAccessor.FUJIX_LIVEVIEW_WAIT_DEFAULT_VALUE;
+
 class FujiStreamReceiver
 {
     private final String TAG = toString();
     private final String ipAddress;
     private final int portNumber;
     private final ILiveViewImage imageViewer;
-    private static final int WAIT_MS = 80;
+    private int waitMs = 80;
     private static final int BUFFER_SIZE = 1280 * 1024 + 8;
+    private static final int ERROR_LIMIT = 30;
     private boolean isStart = false;
 
-    FujiStreamReceiver(String ip, int portNumber, @NonNull ILiveViewImage imageViewer)
+    FujiStreamReceiver(@NonNull Activity activity, String ip, int portNumber, @NonNull ILiveViewImage imageViewer)
     {
         this.ipAddress = ip;
         this.portNumber = portNumber;
         this.imageViewer = imageViewer;
+
+        try
+        {
+            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
+            String waitMsStr = preferences.getString(FUJIX_LIVEVIEW_WAIT, FUJIX_LIVEVIEW_WAIT_DEFAULT_VALUE);
+            int wait = Integer.parseInt(waitMsStr);
+            if ((wait >= 10)&&(wait <= 800))
+            {
+                waitMs = wait;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            waitMs = 80;
+        }
+        Log.v(TAG, "LOOP WAIT : " + waitMs + " ms");
     }
 
     void start()
     {
+        if (isStart)
+        {
+            // すでに受信スレッド動作中なので抜ける
+            return;
+        }
         isStart = true;
         Thread thread = new Thread(new Runnable()
         {
@@ -59,6 +89,7 @@ class FujiStreamReceiver
 
     private void startReceive(Socket socket)
     {
+        int errorCount = 0;
         InputStream isr;
         byte[] byteArray;
         try
@@ -78,11 +109,18 @@ class FujiStreamReceiver
             {
                 int read_bytes = isr.read(byteArray, 0, BUFFER_SIZE);
                 imageViewer.updateImage(new ReceivedDataHolder(byteArray, read_bytes));
-                Thread.sleep(WAIT_MS);
+                Thread.sleep(waitMs);
+                errorCount = 0;
             }
             catch (Exception e)
             {
                 e.printStackTrace();
+                errorCount++;
+            }
+            if (errorCount > ERROR_LIMIT)
+            {
+                // エラーが連続でたくさん出たらループをストップさせる
+                isStart = false;
             }
         }
         try