OSDN Git Service

ライブビューができるようになった。
[gokigen/FujiCam.git] / app / src / main / java / net / osdn / gokigen / cameratest / camtest / CamTest.java
index e1878d7..e89b583 100644 (file)
@@ -1,27 +1,41 @@
 package net.osdn.gokigen.cameratest.camtest;
 
 import android.app.Activity;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Environment;
 import android.util.Log;
 import android.view.View;
+import android.widget.ImageView;
 import android.widget.TextView;
 
 import com.google.android.material.snackbar.Snackbar;
 
 import net.osdn.gokigen.cameratest.R;
 import net.osdn.gokigen.cameratest.fuji.Connection;
+import net.osdn.gokigen.cameratest.fuji.ILiveViewImage;
+import net.osdn.gokigen.cameratest.fuji.ReceivedDataHolder;
 
 import androidx.annotation.NonNull;
 
-public class CamTest implements View.OnClickListener
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+
+
+public class CamTest implements View.OnClickListener, ILiveViewImage
 {
     private String TAG = toString();
     private final Activity activity;
     private TextView textview;
     private Connection connection;
+    private FileOutputStream outputStream = null;
+    private int offsetSize = 18;  // 4byte: データサイズ、14byte: (謎の)ヘッダ
+
     public CamTest(@NonNull Activity activity)
     {
         this.activity = activity;
-        this.connection = new Connection();
+        this.connection = new Connection(this);
     }
 
     public void connect()
@@ -29,6 +43,8 @@ public class CamTest implements View.OnClickListener
         Log.v(TAG, "connect request");
         try
         {
+            prepareFile();
+
             Snackbar.make(activity.findViewById(R.id.constraintLayout), R.string.connect, Snackbar.LENGTH_SHORT).show();
 
             showMessageText("START CONNECT");
@@ -57,6 +73,21 @@ public class CamTest implements View.OnClickListener
         showMessageText("BBBB");
     }
 
+    public void valueUp()
+    {
+        Log.v(TAG, "value UP");
+        offsetSize++;
+        showMessageText("OFFSET : " + offsetSize);
+    }
+
+    public void valueDown()
+    {
+        Log.v(TAG, "value DOWN");
+        offsetSize--;
+        showMessageText("OFFSET : " + offsetSize);
+    }
+
+
     private void showMessageText(final String message)
     {
         activity.runOnUiThread(new Runnable() {
@@ -84,17 +115,236 @@ public class CamTest implements View.OnClickListener
         switch (id)
         {
             case R.id.button1:
-                showMessageText("Button1");
+                doShutter();
                 break;
             case R.id.button2:
-                showMessageText("Button2");
+                readImageFile("sampledata1.bin");
+                showMessageText("show 'sampledata1.bin'.");
                 break;
             case R.id.button3:
-                showMessageText("Button3");
+                readImageFile("sampledata2.bin");
+                showMessageText("show 'sampledata2.bin'.");
+                break;
+            case R.id.button4:
+                readImageFile("sampledata3.bin");
+                showMessageText("show 'sampledata3.bin'.");
                 break;
             default:
                 showMessageText("Unknown : " + id);
                 break;
         }
     }
+
+    private void doShutter()
+    {
+        Log.v(TAG, "execute shutter");
+        try
+        {
+            Snackbar.make(activity.findViewById(R.id.constraintLayout), R.string.shutter, Snackbar.LENGTH_SHORT).show();
+            showMessageText("SHUTTER");
+            Thread thread = new Thread(new Runnable() {
+                @Override
+                public void run() {
+                    boolean ret = connection.execute_shutter();
+                    if (!ret)
+                    {
+                        showMessageText("SHUTTER FAILURE...");
+                    }
+                }
+            });
+            thread.start();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void updateImage(ReceivedDataHolder receivedData)
+    {
+        try
+        {
+            final byte[] dataValue = receivedData.getData();
+            //byte[] startJpegMarker = {(byte)0xff, (byte)0xd8};
+            //byte[] endJpegMarker   = {(byte)0xff, (byte)0xd9};
+
+            Log.v(TAG, "Image : "+ dataValue.length + " bytes.");
+
+            // ダミーの記録ファイルが開いていたらファイルに書いておく。
+            outputFile(receivedData);
+
+            ///////  Bitmap画像を作る... //////
+            final Bitmap imageData = getBitmap(receivedData);
+            if (imageData != null)
+            {
+                //////  画像を更新する
+                activity.runOnUiThread(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            // ビットマップイメージを表示する。
+                            ImageView view = activity.findViewById(R.id.imageView);
+                            view.setImageBitmap(imageData);
+                            view.invalidate();
+                        } catch (Throwable e) {
+                            e.printStackTrace();
+                        }
+                    }
+                });
+            }
+        }
+        catch (Throwable e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    @Override
+    public void updateImage(final Bitmap bitmap)
+    {
+        try
+        {
+            Log.v(TAG, "bitmap : " + bitmap.getByteCount() + " bytes.");
+
+            //////  画像を更新する
+            activity.runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    try
+                    {
+                        // ビットマップイメージを表示する。
+                        ImageView view = activity.findViewById(R.id.imageView);
+                        view.setImageBitmap(bitmap);
+                        view.invalidate();
+                    }
+                    catch (Throwable e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+        catch (Throwable e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void outputFile(ReceivedDataHolder receivedData)
+    {
+        try
+        {
+            if (outputStream != null)
+            {
+                final byte[] byteData = receivedData.getData();
+                outputStream.write(byteData, 0, byteData.length);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void prepareFile()
+    {
+        try
+        {
+            final String directoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/AirA01a/";
+            final String outputFileName = "camtest.bin";
+            File filepath = new File(directoryPath.toLowerCase(), outputFileName.toLowerCase());
+            outputStream = new FileOutputStream(filepath);
+          }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            outputStream = null;
+        }
+    }
+
+    private void readImageFile(final String readFileName)
+    {
+        Thread thread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                    readImageFileImpl(readFileName);
+            }
+        });
+        try
+        {
+            thread.start();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void readImageFileImpl(final String readFileName)
+    {
+        try
+        {
+            Log.v(TAG, "readImageFileImpl() : " + readFileName);
+            final String directoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/AirA01a/";
+            File filepath = new File(directoryPath.toLowerCase(), readFileName.toLowerCase());
+            FileInputStream istr = new FileInputStream(filepath);
+            final Bitmap imageData = BitmapFactory.decodeStream(istr);
+            istr.close();
+            if (imageData == null)
+            {
+                Log.v(TAG, "readImageFileImpl() : bitmap is NULL.");
+            }
+            else
+            {
+                Log.v(TAG, "readImageFileImpl() : bitmap is " + imageData.getByteCount() + " bytes.");
+            }
+
+            //////  画像表示を更新する //////
+            activity.runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    try
+                    {
+                        // ビットマップイメージを表示する。
+                        ImageView view = activity.findViewById(R.id.information_view);
+                        view.setImageBitmap(imageData);
+                        view.invalidate();
+                    }
+                    catch (Throwable e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+        catch (Throwable e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+
+    private Bitmap getBitmap(ReceivedDataHolder receivedData)
+    {
+        try
+        {
+            final byte[] data = receivedData.getData();
+            final Bitmap imageData = BitmapFactory.decodeByteArray(data, offsetSize, (data.length - offsetSize));
+            if (imageData == null)
+            {
+                Log.v(TAG, "readImageFileImpl() : bitmap is NULL. (offset : " + offsetSize + ")");
+            }
+            else
+            {
+                Log.v(TAG, "readImageFileImpl() : bitmap is " + imageData.getByteCount() + " bytes.");
+            }
+            return (imageData);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (null);
+    }
 }