OSDN Git Service

設定変える準備を搭載。
[gokigen/FujiCam.git] / app / src / main / java / net / osdn / gokigen / cameratest / fuji / statuses / FujiStatusChecker.java
1 package net.osdn.gokigen.cameratest.fuji.statuses;
2
3 import android.util.Log;
4
5 import androidx.annotation.NonNull;
6
7 import net.osdn.gokigen.cameratest.fuji.ReceivedDataHolder;
8
9 public class FujiStatusChecker implements IFujiStatusReceiver
10 {
11     private final String TAG = toString();
12     private final IFujiStatusRequest comm;
13     private final IFujiStatusNotify notify;
14     private final FujiStatusHolder statusHolder;
15     private static final int  ERROR_LIMIT = 10;
16     private boolean threadIsRunning = false;
17     private final int WAIT_MS = 400;
18
19     public FujiStatusChecker(@NonNull IFujiStatusRequest comm, @NonNull IFujiStatusNotify notify)
20     {
21         this.comm = comm;
22         this.notify = notify;
23         this.statusHolder = new FujiStatusHolder();
24     }
25
26     @Override
27     public void statusReceived(ReceivedDataHolder data)
28     {
29         statusReceivedImpl(data.getData());
30     }
31
32     @Override
33     public void start()
34     {
35         Thread thread = new Thread(new Runnable() {
36             @Override
37             public void run()
38             {
39
40                 int errorCount = 0;
41                 threadIsRunning = true;
42                 while (threadIsRunning)
43                 {
44                     try
45                     {
46                         comm.requestStatus();
47                         Thread.sleep(WAIT_MS);
48                         errorCount = 0;
49                     }
50                     catch (Exception e)
51                     {
52                         e.printStackTrace();
53                         errorCount++;
54                     }
55                     if (errorCount > ERROR_LIMIT)
56                     {
57                         threadIsRunning = false;
58                     }
59                 }
60                 Log.v(TAG, "--- FINISH STATUS WATCH ---");
61             }
62         });
63         try
64         {
65             if (!threadIsRunning)
66             {
67                 Log.v(TAG, "--- START STATUS WATCH ---");
68                 thread.start();
69             }
70         }
71         catch (Exception e)
72         {
73             e.printStackTrace();
74         }
75     }
76
77     public int getValue(int statusId)
78     {
79         return (statusHolder.getValue(statusId));
80     }
81
82     @Override
83     public void stop()
84     {
85         threadIsRunning = false;
86     }
87
88     private void statusReceivedImpl(byte[] data)
89     {
90         boolean isStatusUpdated = false;
91         try
92         {
93             if (data.length < 14)
94             {
95                 Log.v(TAG, "received status length is short. (" + data.length + " bytes.)");
96                 return;
97             }
98
99             int nofStatus = (data[13] * 256) + data[12];
100             //Log.v(TAG, "status Received. " + data.length + " bytes. [status : " + nofStatus + "]");
101
102             int statusCount = 0;
103             int index = 14;
104             while ((statusCount < nofStatus)&&(index < data.length))
105             {
106                 int dataId = ((((int)data[index + 1]) & 0xff) * 256) + (((int) data[index]) & 0xff);
107                 statusHolder.updateValue(dataId, data[index + 2], data[index + 3], data[index +4], data[index + 5]);
108                 index = index + 6;
109                 statusCount++;
110                 isStatusUpdated = true;
111             }
112             if (isStatusUpdated)
113             {
114                 notify.statusUpdated(statusHolder);
115             }
116         }
117         catch (Exception e)
118         {
119             e.printStackTrace();
120         }
121     }
122 }