OSDN Git Service

Kodak PIXPRO WPZ2 の接続時にフラッシュモードを設定するようにした。
[gokigen/A01d.git] / app / src / main / java / net / osdn / gokigen / a01d / camera / kodak / wrapper / connection / KodakCameraConnectSequence.java
1 package net.osdn.gokigen.a01d.camera.kodak.wrapper.connection;
2
3 import android.app.Activity;
4 import android.content.SharedPreferences;
5 import android.graphics.Color;
6 import android.util.Log;
7
8 import androidx.annotation.NonNull;
9 import androidx.preference.PreferenceManager;
10
11 import net.osdn.gokigen.a01d.R;
12 import net.osdn.gokigen.a01d.camera.ICameraConnection;
13 import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
14 import net.osdn.gokigen.a01d.camera.kodak.IKodakInterfaceProvider;
15 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.IKodakCommandCallback;
16 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.IKodakCommandPublisher;
17 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.IKodakMessages;
18 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence01;
19 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence02;
20 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence03;
21 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence04;
22 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence05;
23 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence06;
24 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence07;
25 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence08;
26 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence09;
27 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence10;
28 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.connection.KodakConnectSequence11;
29 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.specific.KodakFlashAuto;
30 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.specific.KodakFlashOff;
31 import net.osdn.gokigen.a01d.camera.kodak.wrapper.command.messages.specific.KodakFlashOn;
32 import net.osdn.gokigen.a01d.camera.kodak.wrapper.status.KodakStatusChecker;
33
34 import static net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.KODAK_FLASH_MODE;
35 import static net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor.KODAK_FLASH_MODE_DEFAULT_VALUE;
36
37 public class KodakCameraConnectSequence implements Runnable, IKodakCommandCallback, IKodakMessages
38 {
39     private final String TAG = this.toString();
40
41     private final Activity context;
42     private final ICameraConnection cameraConnection;
43     private final ICameraStatusReceiver cameraStatusReceiver;
44     private final IKodakInterfaceProvider interfaceProvider;
45     private final IKodakCommandPublisher commandIssuer;
46     private final KodakStatusChecker statusChecker;
47
48     private String flashMode = "OFF";
49
50     KodakCameraConnectSequence(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IKodakInterfaceProvider interfaceProvider, @NonNull KodakStatusChecker statusChecker)
51     {
52         Log.v(TAG, " KodakCameraConnectSequence");
53         this.context = context;
54         this.cameraConnection = cameraConnection;
55         this.cameraStatusReceiver = statusReceiver;
56         this.interfaceProvider = interfaceProvider;
57         this.commandIssuer = interfaceProvider.getCommandPublisher();
58         this.statusChecker = statusChecker;
59     }
60
61     @Override
62     public void run()
63     {
64         try
65         {
66             SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
67             if (preferences != null)
68             {
69                 flashMode = preferences.getString(KODAK_FLASH_MODE, KODAK_FLASH_MODE_DEFAULT_VALUE);
70             }
71         }
72         catch (Exception e)
73         {
74             e.printStackTrace();
75             flashMode = "OFF";
76         }
77
78         try
79         {
80             // カメラとTCP接続
81             IKodakCommandPublisher issuer = interfaceProvider.getCommandPublisher();
82             if (!issuer.isConnected())
83             {
84                 if (!interfaceProvider.getCommandCommunication().connect())
85                 {
86                     // 接続失敗...
87                     interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.dialog_title_connect_failed_kodak), false, true, Color.RED);
88                     onConnectError(context.getString(R.string.dialog_title_connect_failed_kodak));
89                     return;
90                 }
91             }
92             else
93             {
94                 Log.v(TAG, "SOCKET IS ALREADY CONNECTED...");
95             }
96             // コマンドタスクの実行開始
97             issuer.start();
98
99             // 接続シーケンスの開始
100             startConnectSequence();
101
102         }
103         catch (Exception e)
104         {
105             e.printStackTrace();
106             interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.dialog_title_connect_failed_kodak), false, true, Color.RED);
107             onConnectError(e.getLocalizedMessage());
108         }
109     }
110
111     private void onConnectError(String reason)
112     {
113         cameraConnection.alertConnectingFailed(reason);
114     }
115
116     @Override
117     public void receivedMessage(int id, byte[] rx_body)
118     {
119         switch (id)
120         {
121             case SEQ_CONNECT_01:
122                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting1), false, false, 0);
123                 commandIssuer.enqueueCommand(new KodakConnectSequence02(this));
124                 break;
125
126             case SEQ_CONNECT_02:
127                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting2), false, false, 0);
128                 commandIssuer.enqueueCommand(new KodakConnectSequence03(this));
129                 break;
130
131             case SEQ_CONNECT_03:
132                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting3), false, false, 0);
133                 commandIssuer.enqueueCommand(new KodakConnectSequence04(this));
134                 break;
135             case SEQ_CONNECT_04:
136                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting4), false, false, 0);
137                 commandIssuer.enqueueCommand(new KodakConnectSequence05(this));
138                 break;
139             case SEQ_CONNECT_05:
140                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting5), false, false, 0);
141                 commandIssuer.enqueueCommand(new KodakConnectSequence06(this));
142                 break;
143             case SEQ_CONNECT_06:
144                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting6), false, false, 0);
145                 commandIssuer.enqueueCommand(new KodakConnectSequence07(this));
146                 break;
147             case SEQ_CONNECT_07:
148                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting7), false, false, 0);
149                 commandIssuer.enqueueCommand(new KodakConnectSequence08(this));
150                 break;
151             case SEQ_CONNECT_08:
152                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting8), false, false, 0);
153                 commandIssuer.enqueueCommand(new KodakConnectSequence09(this));
154                 break;
155             case SEQ_CONNECT_09:
156                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting9), false, false, 0);
157                 commandIssuer.enqueueCommand(new KodakConnectSequence10(this));
158                 break;
159             case SEQ_CONNECT_10:
160                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting10), false, false, 0);
161                 commandIssuer.enqueueCommand(new KodakConnectSequence11(this));
162                 break;
163             case SEQ_CONNECT_11:
164                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.kodak_connect_connecting11), false, false, 0);
165                 if (flashMode.contains("AUTO"))
166                 {
167                     commandIssuer.enqueueCommand(new KodakFlashAuto(this));
168                 }
169                 else if (flashMode.contains("ON"))
170                 {
171                     commandIssuer.enqueueCommand(new KodakFlashOn(this));
172                 }
173                 else
174                 {
175                     commandIssuer.enqueueCommand(new KodakFlashOff(this));
176                 }
177                 break;
178             case SEQ_FLASH_AUTO:
179             case SEQ_FLASH_OFF:
180             case SEQ_FLASH_ON:
181                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connect_finished), false, false, 0);
182                 connectFinished();
183                 Log.v(TAG, "  CONNECT TO CAMERA : DONE.");
184                 break;
185             default:
186                 Log.v(TAG, " RECEIVED UNKNOWN ID : " + id);
187                 onConnectError(context.getString(R.string.connect_receive_unknown_message));
188                 break;
189         }
190     }
191
192     private void startConnectSequence()
193     {
194         interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_start), false, false, 0);
195         cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_start));
196         commandIssuer.enqueueCommand(new KodakConnectSequence01(this));
197     }
198
199     private void connectFinished()
200     {
201         try
202         {
203             // 接続成功のメッセージを出す
204             interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connected), false, false, 0);
205
206             // ちょっと待つ
207             Thread.sleep(1000);
208
209             //interfaceProvider.getAsyncEventCommunication().connect();
210             //interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());  ステータスの定期確認は実施しない
211
212             // 接続成功!のメッセージを出す
213             interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connected), false, false, 0);
214
215             onConnectNotify();
216         }
217         catch (Exception e)
218         {
219             e.printStackTrace();
220         }
221     }
222
223     private void onConnectNotify()
224     {
225         try
226         {
227             final Thread thread = new Thread(new Runnable()
228             {
229                 @Override
230                 public void run()
231                 {
232                     // カメラとの接続確立を通知する
233                     cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
234                     cameraStatusReceiver.onCameraConnected();
235                     Log.v(TAG, " onConnectNotify()");
236                 }
237             });
238             thread.start();
239         }
240         catch (Exception e)
241         {
242             e.printStackTrace();
243         }
244     }
245 }