OSDN Git Service

ちょっと追加。
[gokigen/FujiCam.git] / app / src / main / java / net / osdn / gokigen / cameratest / fuji / Connection.java
index 7edc801..0df760a 100644 (file)
@@ -1,17 +1,26 @@
 package net.osdn.gokigen.cameratest.fuji;
 
+import android.graphics.PointF;
 import android.util.Log;
 
-public class Connection
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.cameratest.fuji.statuses.FujiStatusChecker;
+import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusNotify;
+import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusRequest;
+
+public class Connection implements IFujiStatusRequest
 {
     private final String TAG = toString();
     private final MessageSequence sequence;
     private final Communication comm;
+    private final FujiStatusChecker statusChecker;
 
-    public Connection()
+    public Connection(@NonNull ILiveViewImage imageViewer, @NonNull IFujiStatusNotify notify)
     {
-        this.comm = new Communication();
+        this.comm = new Communication(imageViewer);
         this.sequence = new MessageSequence();
+        this.statusChecker = new FujiStatusChecker(this, notify);
     }
 
     public boolean start_connect()
@@ -20,139 +29,105 @@ public class Connection
 
         if (connect_to_camera())
         {
-            ret = get_current_settings();
+            ret = requestStatus();
+            if (ret)
+            {
+                // 定期監視の開始
+                statusChecker.start();
+            }
         }
         return (ret);
     }
 
-
     private boolean connect_to_camera()
     {
-
         try
         {
-            int indexNumber = 0;
+            ReceivedDataHolder rx_bytes;
             comm.connect_socket();
 
-            comm.send_to_camera(sequence.registration_message());
+            comm.send_to_camera(sequence.registration_message(), false);
+            rx_bytes = comm.receive_from_camera();
+            dump_bytes(0, rx_bytes);
+            Thread.sleep(50);
 
-            ReceivedData rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-/*
-            応答エラーの場合は この値が返ってくるはず  = {0x05, 0x00, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00};
-*/
+            // 応答エラーの場合は この値が返ってくるはず  = {0x05, 0x00, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00};
 
             // start_messageを送信
-            comm.send_to_camera(sequence.start_message());
-
+            comm.send_to_camera(sequence.start_message(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-
-/**/
-            //  なんだろう?? (必要なようだが)
-            comm.send_to_camera(sequence.start_message2());
+            dump_bytes(1, rx_bytes);
+            Thread.sleep(50);
 
+            //  なんだろう?? (送信が必要なようだが)
+            comm.send_to_camera(sequence.start_message2(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-/**/
+            dump_bytes(2, rx_bytes);
+            Thread.sleep(50);
 
             // two_part messageを発行 (その1)
-            comm.send_to_camera(sequence.start_message3_1());
-
+            comm.send_to_camera(sequence.start_message3_1(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
+            dump_bytes(3, rx_bytes);
+            Thread.sleep(50);
 
             // two_part messageを発行 (その2)
-            comm.send_to_camera(sequence.start_message3_2());
-
+            comm.send_to_camera(sequence.start_message3_2(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
+            dump_bytes(4, rx_bytes);
+            Thread.sleep(50);
 
             // remote mode
-            comm.send_to_camera(sequence.start_message4());
-
+            comm.send_to_camera(sequence.start_message4(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-
+            dump_bytes(5, rx_bytes);
+            Thread.sleep(50);
 
             // two_part messageを発行 (その1)
-            comm.send_to_camera(sequence.start_message5_1());
-
+            comm.send_to_camera(sequence.start_message5_1(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
+            dump_bytes(6, rx_bytes);
+            Thread.sleep(50);
 
             // two_part messageを発行 (その2)
-            comm.send_to_camera(sequence.start_message5_2());
-
+            comm.send_to_camera(sequence.start_message5_2(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-
+            dump_bytes(7, rx_bytes);
+            Thread.sleep(50);
 
             // ????
-            comm.send_to_camera(sequence.start_message6());
-
+            comm.send_to_camera(sequence.start_message6(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-
+            dump_bytes(8, rx_bytes);
+            Thread.sleep(50);
 
             // ????
-            comm.send_to_camera(sequence.start_message7());
-
+            comm.send_to_camera(sequence.start_message7(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
+            dump_bytes(9, rx_bytes);
+            Thread.sleep(50);
 
             // ????
-            comm.send_to_camera(sequence.start_message8());
-
+            comm.send_to_camera(sequence.start_message8(), false);
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
+            dump_bytes(10, rx_bytes);
+            Thread.sleep(50);
 
             // ????
-            comm.send_to_camera(sequence.start_message9());
+            comm.send_to_camera(sequence.start_message9(), false);
 
+            // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
             rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-
+            dump_bytes(11, rx_bytes);
+            Thread.sleep(150);
 
-/*
-            comm.send_to_camera(sequence.start_message2());
 
-            //byte[] rx_bytes = comm.receive_from_camera();
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(indexNumber, rx_bytes);
-            indexNumber++;
-*/
-/*
-            応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
-
-*/
-
-
-/*
-            auto const msg4_1 =
-                make_static_message(message_type::two_part, 0x01, 0xdf, 0x00, 0x00);
-            auto const msg4_2 = make_static_message_followup(msg4_1, 0x05, 0x00);
-            fuji_twopart_message(sockfd, msg4_1, msg4_2);
-*/
-
-            // 別のポートもオープンしておく
+            // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
+            Thread.sleep(2000);
             comm.start_stream();
             comm.start_response();
 
             Log.v(TAG, "connect_to_camera DONE.");
-
             return (true);
         }
         catch (Exception e)
@@ -162,19 +137,51 @@ public class Connection
         return (false);
     }
 
-    private boolean get_current_settings()
+    public void reset_to_camera()
     {
         try
         {
-            comm.send_to_camera(sequence.status_request_message());
+            comm.send_to_camera(sequence.reset_message(), true);
+            ReceivedDataHolder rx_bytes = comm.receive_from_camera();
+            dump_bytes(0, rx_bytes);
+            statusChecker.stop();
+            Thread.sleep(150);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
 
-            ReceivedData rx_bytes = comm.receive_from_camera();
-            dump_bytes(12, rx_bytes);
+    public void disconnect()
+    {
+        try
+        {
+            comm.stop_stream();
+            comm.stop_response();
+            comm.disconnect_socket();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
 
-            // なんで2回... でもやってみる
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(13, rx_bytes);
+    @Override
+    public boolean requestStatus()
+    {
+        try
+        {
+            comm.send_to_camera(sequence.status_request_message(), true);
+            ReceivedDataHolder rx_bytes = comm.receive_from_camera();
+            if (rx_bytes.getData().length > 0)
+            {
+                // 受信したステータス情報を渡す
+                statusChecker.statusReceived(rx_bytes);
+            }
+            dump_bytes(12, rx_bytes);
 
+            return (true);
         }
         catch (Exception e)
         {
@@ -183,9 +190,7 @@ public class Connection
         return (false);
     }
 
-
-
-    private void dump_bytes(int indexNumber,ReceivedData data)
+    private void dump_bytes(int indexNumber, ReceivedDataHolder data)
     {
         int index = 0;
         StringBuffer message;
@@ -208,19 +213,50 @@ public class Connection
         System.gc();
     }
 
-    public boolean execute_shutter()
+    public boolean execute_focus_point(PointF point)
     {
         try
         {
-            comm.send_to_camera(sequence.execute_shutter_message());
+            byte x = (byte) (0x000000ff & Math.round(point.x));
+            byte y = (byte) (0x000000ff & Math.round(point.y));
+            Log.v(TAG, "DRIVE AF (" + x + "," + y + ")");
 
-            ReceivedData rx_bytes = comm.receive_from_camera();
-            dump_bytes(14, rx_bytes);
+            comm.send_to_camera(sequence.execute_focus_lock(x, y), true);
 
-            // なんで2回... でもやってみる
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(15, rx_bytes);
+            ReceivedDataHolder rx_bytes = comm.receive_from_camera();
+            dump_bytes(16, rx_bytes);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (false);
+    }
+
+    public boolean execute_unlock_focus()
+    {
+        try
+        {
+            comm.send_to_camera(sequence.execute_focus_unlock(), true);
+
+            ReceivedDataHolder rx_bytes = comm.receive_from_camera();
+            dump_bytes(17, rx_bytes);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (false);
+    }
+
+    public boolean execute_shutter()
+    {
+        try
+        {
+            comm.send_to_camera(sequence.execute_shutter_message(), true);
 
+            ReceivedDataHolder rx_bytes = comm.receive_from_camera();
+            dump_bytes(14, rx_bytes);
         }
         catch (Exception e)
         {