1 package net.osdn.gokigen.cameratest.camtest;
3 import android.app.Activity;
4 import android.graphics.Bitmap;
5 import android.graphics.BitmapFactory;
6 import android.os.Environment;
7 import android.util.Log;
8 import android.view.View;
9 import android.widget.ImageView;
10 import android.widget.TextView;
12 import com.google.android.material.snackbar.Snackbar;
14 import net.osdn.gokigen.cameratest.R;
15 import net.osdn.gokigen.cameratest.fuji.Connection;
16 import net.osdn.gokigen.cameratest.fuji.ILiveViewImage;
17 import net.osdn.gokigen.cameratest.fuji.ReceivedDataHolder;
19 import androidx.annotation.NonNull;
22 import java.io.FileInputStream;
23 import java.io.FileOutputStream;
26 public class CamTest implements View.OnClickListener, ILiveViewImage
28 private String TAG = toString();
29 private final Activity activity;
30 private TextView textview;
31 private Connection connection;
32 private FileOutputStream outputStream = null;
33 private int offsetSize = 18; // 4byte: データサイズ、14byte: (謎の)ヘッダ
35 public CamTest(@NonNull Activity activity)
37 this.activity = activity;
38 this.connection = new Connection(this);
43 Log.v(TAG, "connect request");
48 Snackbar.make(activity.findViewById(R.id.constraintLayout), R.string.connect, Snackbar.LENGTH_SHORT).show();
50 showMessageText("START CONNECT");
51 Thread thread = new Thread(new Runnable() {
54 boolean ret = connection.start_connect();
57 showMessageText("CONNECT FAILURE...");
69 public void settings()
71 Log.v(TAG, "settings menu");
73 showMessageText("BBBB");
78 Log.v(TAG, "value UP");
80 showMessageText("OFFSET : " + offsetSize);
83 public void valueDown()
85 Log.v(TAG, "value DOWN");
87 showMessageText("OFFSET : " + offsetSize);
91 private void showMessageText(final String message)
93 activity.runOnUiThread(new Runnable() {
97 if (textview == null) {
98 textview = activity.findViewById(R.id.show_information);
100 if (textview != null) {
101 textview.setText(message);
103 } catch (Exception e) {
111 public void onClick(View v)
113 Log.v(TAG, "onClick : " + v.getId());
121 readImageFile("sampledata1.bin");
122 showMessageText("show 'sampledata1.bin'.");
125 readImageFile("sampledata2.bin");
126 showMessageText("show 'sampledata2.bin'.");
129 readImageFile("sampledata3.bin");
130 showMessageText("show 'sampledata3.bin'.");
133 showMessageText("Unknown : " + id);
138 private void doShutter()
140 Log.v(TAG, "execute shutter");
143 Snackbar.make(activity.findViewById(R.id.constraintLayout), R.string.shutter, Snackbar.LENGTH_SHORT).show();
144 showMessageText("SHUTTER");
145 Thread thread = new Thread(new Runnable() {
148 boolean ret = connection.execute_shutter();
151 showMessageText("SHUTTER FAILURE...");
164 public void updateImage(ReceivedDataHolder receivedData)
168 final byte[] dataValue = receivedData.getData();
169 //byte[] startJpegMarker = {(byte)0xff, (byte)0xd8};
170 //byte[] endJpegMarker = {(byte)0xff, (byte)0xd9};
172 Log.v(TAG, "Image : "+ dataValue.length + " bytes.");
174 // ダミーの記録ファイルが開いていたらファイルに書いておく。
175 outputFile(receivedData);
177 /////// Bitmap画像を作る... //////
178 final Bitmap imageData = getBitmap(receivedData);
179 if (imageData != null)
182 activity.runOnUiThread(new Runnable() {
187 ImageView view = activity.findViewById(R.id.imageView);
188 view.setImageBitmap(imageData);
190 } catch (Throwable e) {
204 public void updateImage(final Bitmap bitmap)
208 Log.v(TAG, "bitmap : " + bitmap.getByteCount() + " bytes.");
211 activity.runOnUiThread(new Runnable() {
217 ImageView view = activity.findViewById(R.id.imageView);
218 view.setImageBitmap(bitmap);
234 private void outputFile(ReceivedDataHolder receivedData)
238 if (outputStream != null)
240 final byte[] byteData = receivedData.getData();
241 outputStream.write(byteData, 0, byteData.length);
250 private void prepareFile()
254 final String directoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/AirA01a/";
255 final String outputFileName = "camtest.bin";
256 File filepath = new File(directoryPath.toLowerCase(), outputFileName.toLowerCase());
257 outputStream = new FileOutputStream(filepath);
266 private void readImageFile(final String readFileName)
268 Thread thread = new Thread(new Runnable() {
271 readImageFileImpl(readFileName);
284 private void readImageFileImpl(final String readFileName)
288 Log.v(TAG, "readImageFileImpl() : " + readFileName);
289 final String directoryPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/AirA01a/";
290 File filepath = new File(directoryPath.toLowerCase(), readFileName.toLowerCase());
291 FileInputStream istr = new FileInputStream(filepath);
292 final Bitmap imageData = BitmapFactory.decodeStream(istr);
294 if (imageData == null)
296 Log.v(TAG, "readImageFileImpl() : bitmap is NULL.");
300 Log.v(TAG, "readImageFileImpl() : bitmap is " + imageData.getByteCount() + " bytes.");
303 ////// 画像表示を更新する //////
304 activity.runOnUiThread(new Runnable() {
310 ImageView view = activity.findViewById(R.id.information_view);
311 view.setImageBitmap(imageData);
328 private Bitmap getBitmap(ReceivedDataHolder receivedData)
332 final byte[] data = receivedData.getData();
333 final Bitmap imageData = BitmapFactory.decodeByteArray(data, offsetSize, (data.length - offsetSize));
334 if (imageData == null)
336 Log.v(TAG, "readImageFileImpl() : bitmap is NULL. (offset : " + offsetSize + ")");
340 Log.v(TAG, "readImageFileImpl() : bitmap is " + imageData.getByteCount() + " bytes.");