ghy
Alejandro Acuña
2025-03-12 26319e4c5bfbee722c15b8e7ccca9b6127bb1cb8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
package art.servers.colorsserver.M.protocol;
 
import java.io.ByteArrayOutputStream;
 
public class M_ProtocolWriter 
{
    public static final int STX   = 0x02;
    public static final int ETX   = 0x03;
    public static final int EOB12 = 0x0A;
    public static final int EOB14 = 0x0C;
    public static final int EOB15 = 0x0D;
 
    public static final int HTR   = 0x33;
    public static final int PRH   = 0x40;
    public static final int DET   = 0x20;
 
    public static final int M_READ_TABLE_FULL = 0x20;  // A0;
    public static final int M_WRITE_TABLE_FULL = 0x60;  // E0;
    public static final int M_READ_TABLE_PARTIAL = 0x21;  // A1;
    public static final int M_WRITE_TABLE_PARTIAL = 0x61;  // E1;
 
    public static final int M_START_RECORDING = 0x59;  // D9;
    public static final int M_START_RECORDING_RESPONSE = 0x19;  // 99;
 
    public static final int M_END_RECORDING = 0x5A;  // DA;
    public static final int M_END_RECORDING_RESPONSE = 0x1A;  // 9A;
 
    public static final int M_RECORDABLE_PLAN_QUERY = 0x10;  // 90;
    public static final int M_CURRENT_PLAN_QUERY = 0x11;  // 91;
    public static final int M_CURRENT_TIME_QUERY = 0x12;  // 92;
    public static final int M_CURRENT_SUBCONTROLLER_STATE_QUERY = 0x14;  // 94;
    public static final int M_CURRENT_PRESENCE_DETECTORS = 0x30;  // B0;
    public static final int M_CURRENT_COUNTING_DETECTORS_DATETIME = 0x32;  // B2;
    public static final int M_CURRENT_COUNTING_DETECTORS = 0x33;  // B3;
    public static final int M_ALARMS_QUERY = 0x34;  // B4;
    public static final int M_BLOWN_LAMPS_ALARMS_QUERY = 0x35;  // B5;
    public static final int M_DAMAGED_GROUP_ALARMS_QUERY = 0x36;  // B6;
    public static final int M_INCOMPATIBILITY_ALARMS_QUERY = 0x37;  // B7;
    public static final int M_CURRENT_STATUS_GROUPS_QUERY = 0x39;  // B9;
 
    public static final int M_SET_REALTIME_BUS_DETECTIONS_ENABLE = 0x40;  // C0;
    public static final int M_SET_REALTIME_BUS_DETECTIONS_DISABLE = 0x41;  // C1;
 
    public static final int M_REALTIME_BUS_DETECTIONS = 0x3B;  // BB;
    public static final int M_BUS_DETECTIONS_QUERY = 0x3C;  // BC;
 
    public static final int M_SAVE_RECORDABLE_PLAN = 0x50;  // D0;
    public static final int M_SELECT_PLAN = 0x51;  // D1;
    public static final int M_SET_TIME = 0x52;  // D2;
    public static final int M_SET_REALTIME_DETECTORS = 0x53;  // D3;
    public static final int M_SET_STATE = 0x54;  // D4;
    public static final int M_PHASE_CHANGING = 0x55;  // D5;
    public static final int M_DIRECT_GROUP_OUTPUT = 0x56;  // D6;
    public static final int M_GROUPS_REALTIME_ENABLE = 0x5B;  // DB;
    public static final int M_GROUPS_REALTIME_DISABLE = 0x5C;  // DC;
    public static final int M_ERASE_ALARMS = 0x5D;  // DD;
 
    public static final int M_SELECT_SPECIAL_DEMAND = 0x5E;  // DE;
    public static final int M_CANCEL_SPECIAL_DEMAND = 0x5F;  // DF;
 
    private ByteArrayOutputStream bos = new ByteArrayOutputStream();
    
    
    public M_ProtocolWriter()
    {
    }
 
    
    public void write(int data)
    {
        bos.write((data & 0x7F) + 0x80);
    }
 
    
    public void writeRaw(int data)
    {
        bos.write(data);
    }
 
    
    public void writeEOB(int data)
    {
        bos.write(data & 0x7F);
    }
    
 
    public void write(int[] data)
    {
        for (int i=0; i<data.length; i++)
        {
            write(data[i]);
        }
    }
 
 
    public void STX()
    {
        bos.write(STX & 0x7F);
    }
 
 
    public void DET()
    {
        bos.write(DET & 0x7F);
    }
 
 
    public void ETX(boolean hasCRC)
    {
        if (hasCRC == true)
        {
            byte[] data = toByteArray();
            byte crc = 0x00;
            for (int i=1; i<data.length; i++)
            {
                crc = (byte)(crc ^ (byte)((data[i] - 0x80)));
            }
 
            bos.write((crc & 0x7F) + 0x80);
        }
 
        bos.write(ETX & 0x7F);
    }
 
    // 02 81 A0 8F AE 03
 
    public void EOB12()
    {
        bos.write(EOB12 & 0x7F);
    }
    
    public void EOB14()
    {
        bos.write(EOB14 & 0x7F);
    }
    
    public void EOB15()
    {
        bos.write(EOB15 & 0x7F);
    }
    
    
 
    public byte[] toByteArray()
    {
        return bos.toByteArray();
    }
            
 
    public int[] toIntegerArray()
    {
        byte[] data = bos.toByteArray();
        int[] result = new int[data.length];
        for (int i=0; i<data.length; i++) result[i] = (int)data[i] & 0xFF;
        return result;
    }
 
 
    public M_Message createMessage(int controllerCode)
    {
        M_Message message = new M_Message();
        message.controller = controllerCode;
        message.setData(toByteArray());
        message.fillInformation();
        return(message);
    }
 
}