import androidx.annotation.NonNull;
import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraChangeListener;
+import net.osdn.gokigen.pkremote.camera.utils.SimpleHttpClient;
import net.osdn.gokigen.pkremote.camera.vendor.panasonic.wrapper.IPanasonicCamera;
-import org.json.JSONArray;
-import org.json.JSONObject;
-
/**
*
*
public class CameraEventObserver implements ICameraEventObserver
{
private static final String TAG = CameraEventObserver.class.getSimpleName();
+ private static final int TIMEOUT_MS = 3000;
+ private final CameraStatusHolder statusHolder;
private boolean isEventMonitoring;
private boolean isActive;
private final IPanasonicCamera remote;
- // private final ReplyJsonParser replyParser;
- private String eventVersion = "1.1"; // 初期値を "1.0" から "1.1" に更新
public static ICameraEventObserver newInstance(@NonNull Context context, @NonNull IPanasonicCamera apiClient)
{
{
super();
remote = apiClient;
- //replyParser = new ReplyJsonParser(new Handler(context.getMainLooper()));
+ statusHolder = new CameraStatusHolder(context);
isEventMonitoring = false;
isActive = false;
}
Log.w(TAG, "start() observer is not active.");
return (false);
}
-
if (isEventMonitoring)
{
Log.w(TAG, "start() already starting.");
return (false);
}
+ isEventMonitoring = true;
- isEventMonitoring = false;
try
{
Thread thread = new Thread()
public void run()
{
Log.d(TAG, "start() exec.");
- boolean firstCall = true;
- MONITORLOOP: while (isEventMonitoring)
+ while (isEventMonitoring)
{
- // At first, call as non-Long Polling.
- boolean longPolling = !firstCall;
try
{
-/*
- // Call getEvent API.
- JSONObject replyJson = remoteApi.getEvent(eventVersion, longPolling);
-
- // Check error code at first.
- int errorCode = findErrorCode(replyJson);
- Log.d(TAG, "getEvent errorCode: " + errorCode);
- switch (errorCode) {
- case 0: // no error
- // Pass through.
- break;
- case 1: // "Any" error
- case 12: // "No such method" error
- if (eventVersion.equals("1.1"))
- {
- // "1.1" でエラーが発生した時には "1.0" にダウングレードして再実行
- eventVersion = "1.0";
- continue MONITORLOOP;
- }
- replyParser.fireResponseErrorListener();
- break MONITORLOOP; // end monitoring.
-
- case 2: // "Timeout" error
- // Re-call immediately.
- continue MONITORLOOP;
-
- case 40402: // "Already polling" error
- // Retry after 5 sec.
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- // do nothing.
- }
- continue MONITORLOOP;
-
- default:
- Log.w(TAG, "SimpleCameraEventObserver: Unexpected error: " + errorCode);
- replyParser.fireResponseErrorListener();
- break MONITORLOOP; // end monitoring.
- }
-
- // parse
- replyParser.parse(replyJson);
-*/
+ // parse reply message
+ statusHolder.parse(SimpleHttpClient.httpGet(remote.getCmdUrl() + "cam.cgi?mode=getstate", TIMEOUT_MS));
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ try
+ {
+ Thread.sleep(1000);
}
catch (Exception e)
{
e.printStackTrace();
}
- firstCall = false;
- } // MONITORLOOP end.
+ }
isEventMonitoring = false;
}
};
{
try
{
- //replyParser.setEventChangeListener(listener);
+ statusHolder.setEventChangeListener(listener);
}
catch (Exception e)
{
{
try
{
- //replyParser.clearEventChangeListener();
+ statusHolder.clearEventChangeListener();
}
catch (Exception e)
{
@Override
public ICameraStatusHolder getCameraStatusHolder()
{
- return (null);
- //return (replyParser);
+ return (statusHolder);
}
@Override
{
isActive = true;
}
-
- private static int findErrorCode(JSONObject replyJson)
- {
- int code = 0; // 0 means no error.
- try
- {
- if (replyJson.has("error"))
- {
- JSONArray errorObj = replyJson.getJSONArray("error");
- code = errorObj.getInt(0);
- }
- }
- catch (Exception e)
- {
- e.printStackTrace();
- code = -1;
- }
- return (code);
- }
}
package net.osdn.gokigen.pkremote.camera.vendor.panasonic.wrapper.eventlistener;
+import android.content.Context;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraChangeListener;
+
import java.util.List;
public class CameraStatusHolder implements ICameraStatusHolder
{
+ private static final String TAG = CameraStatusHolder.class.getSimpleName();
+ private final Context context;
+ private ICameraChangeListener listener = null;
+
+ CameraStatusHolder(@NonNull Context context)
+ {
+ this.context = context;
+
+ }
+
+ void parse(String reply)
+ {
+ try
+ {
+ Log.v(TAG, " getState : " + reply);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ void setEventChangeListener(@NonNull ICameraChangeListener listener)
+ {
+ this.listener = listener;
+ }
+
+ void clearEventChangeListener()
+ {
+ this.listener = null;
+ }
+
@Override
public String getCameraStatus()
{