1 package net.osdn.gokigen.a01d.camera.fujix.wrapper.liveview;
3 import android.app.Activity;
4 import android.content.SharedPreferences;
5 import android.util.Log;
6 import androidx.annotation.NonNull;
7 import androidx.preference.PreferenceManager;
9 import net.osdn.gokigen.a01d.camera.ILiveViewControl;
10 import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommunication;
11 import net.osdn.gokigen.a01d.liveview.liveviewlistener.CameraLiveViewListenerImpl;
12 import net.osdn.gokigen.a01d.liveview.liveviewlistener.ILiveViewListener;
14 import java.io.InputStream;
15 import java.net.Socket;
16 import java.util.Arrays;
18 import static net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.FUJIX_LIVEVIEW_WAIT;
19 import static net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.FUJIX_LIVEVIEW_WAIT_DEFAULT_VALUE;
22 public class FujiXLiveViewControlAlternate implements ILiveViewControl, IFujiXCommunication
24 private final String TAG = toString();
25 private final String ipAddress;
26 private final int portNumber;
27 private final CameraLiveViewListenerImpl liveViewListener;
28 private int waitMs = 0;
29 private static final int DATA_HEADER_OFFSET = 18;
30 private static final int BUFFER_SIZE = 2048 * 1280;
31 private static final int ERROR_LIMIT = 30;
32 private boolean isStart = false;
33 private boolean logcat = true;
35 public FujiXLiveViewControlAlternate(@NonNull Activity activity, String ip, int portNumber)
38 this.portNumber = portNumber;
39 liveViewListener = new CameraLiveViewListenerImpl();
43 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
44 String waitMsStr = preferences.getString(FUJIX_LIVEVIEW_WAIT, FUJIX_LIVEVIEW_WAIT_DEFAULT_VALUE);
45 logcat("waitMS : " + waitMsStr);
46 if (waitMsStr != null)
48 int wait = Integer.parseInt(waitMsStr);
49 if ((wait >= 20) && (wait <= 800))
60 Log.v(TAG, "LOOP WAIT : " + waitMs + " ms");
64 public void startLiveView()
69 Log.v(TAG, " LiveView IS ALREADY STARTED");
73 Thread thread = new Thread(new Runnable()
80 Socket socket = new Socket(ipAddress, portNumber);
85 Log.v(TAG, " IP : " + ipAddress + " port : " + portNumber);
101 public void stopLiveView()
106 private void startReceive(Socket socket)
108 String lvHeader = "[LV]";
109 int lvHeaderDumpBytes = 24;
116 isr = socket.getInputStream();
117 byteArray = new byte[BUFFER_SIZE + 32];
122 Log.v(TAG, "===== startReceive() aborted.");
129 boolean findJpeg = false;
131 int read_bytes = isr.read(byteArray, 0, BUFFER_SIZE);
134 dump_bytes("[lv]", byteArray, 48);
136 if (read_bytes > DATA_HEADER_OFFSET)
138 // メッセージボディの先頭にあるメッセージ長分は読み込む
139 length_bytes = ((((int) byteArray[3]) & 0xff) << 24) + ((((int) byteArray[2]) & 0xff) << 16) + ((((int) byteArray[1]) & 0xff) << 8) + (((int) byteArray[0]) & 0xff);
140 if ((byteArray[18] == (byte)0xff)&&(byteArray[19] == (byte)0xd8))
143 while ((read_bytes < length_bytes) && (read_bytes < BUFFER_SIZE) && (length_bytes <= BUFFER_SIZE))
145 int append_bytes = isr.read(byteArray, read_bytes, length_bytes - read_bytes);
146 logcat("READ AGAIN : " + append_bytes + " [" + read_bytes + "]");
147 if (append_bytes < 0)
151 read_bytes = read_bytes + append_bytes;
153 logcat("READ BYTES : " + read_bytes + " (" + length_bytes + " bytes, " + waitMs + "ms)");
157 // ウェイトを短めに入れてマーカーを拾うまで待つ
158 Thread.sleep(waitMs/4);
159 logcat(" --- wait LiveView ---");
165 dump_bytes(lvHeader, byteArray, lvHeaderDumpBytes);
169 liveViewListener.onUpdateLiveView(Arrays.copyOfRange(byteArray, DATA_HEADER_OFFSET, read_bytes - DATA_HEADER_OFFSET), null);
172 Thread.sleep(waitMs);
179 if (errorCount > ERROR_LIMIT)
181 // エラーが連続でたくさん出たらループをストップさせる
198 public void updateDigitalZoom()
204 public void updateMagnifyingLiveViewScale(boolean isChangeScale)
210 public float getMagnifyingLiveViewScale()
216 public void changeLiveViewSize(String size)
222 public float getDigitalZoomScale()
227 public ILiveViewListener getLiveViewListener()
229 return (liveViewListener);
233 public boolean connect()
239 public void disconnect()
248 private void dump_bytes(String header, byte[] data, int dumpBytes)
257 StringBuffer message;
262 message = new StringBuffer();
263 for (int point = 0; point < dumpBytes; point++)
265 byte item = data[point];
267 message.append(String.format("%02x ", item));
270 Log.v(TAG, header + " " + message);
272 message = new StringBuffer();
277 Log.v(TAG, header + " " + message);
282 private void logcat(String message)