|
1
2
3
4
5
6
7
8
9
10
11
12
|
//
// CommunicationProtocol.m
// DUREX Vendor Control
//
// Created by Imanol Barba on 5/23/14.
// Copyright (c) 2014 Emmoco. All rights reserved.
//
#import "CommunicationProtocol.h"
@interface CommunicationProtocol ()
|
|
13
14
|
@property Boolean messageAvailableMobile;
@property Boolean messageAvailableDevice;
|
|
15
16
17
18
|
@property NSMutableString *message;
@property NSUInteger currentIndex;
@property NSUInteger remainingBytes;
@property NSInteger numPackets;
|
|
19
|
|
|
20
21
22
23
|
@end
@implementation CommunicationProtocol
|
|
24
25
|
+ (id)sharedProtocol
{
|
|
26
27
28
29
|
static CommunicationProtocol *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[self alloc] init];
|
|
30
31
|
[shared setMessageAvailableDevice:FALSE];
[shared setMessageAvailableMobile:FALSE];
|
|
32
33
34
35
|
});
return shared;
}
|
|
36
|
- (void) reportError : (NSString*) error
|
|
37
|
{
|
|
38
|
|
|
39
40
|
}
|
|
41
|
-(void) readMessage
|
|
42
|
{
|
|
43
|
self.numPackets = -1;
|
|
44
|
[self waitForMessage: 0];
|
|
45
46
|
}
|
|
47
|
- (void) readNextFragment
|
|
48
|
{
|
|
49
50
|
__block NSUInteger numBytes;
if(self.numPackets)
|
|
51
|
{
|
|
52
|
[[EMConnectionManager sharedManager] readResource:@"numBytes" onSuccess:^(id readValue)
|
|
53
|
{
|
|
54
55
56
|
numBytes = [readValue unsignedCharValue];
NSLog(@"[CommunicationProtocol.m]: numBytes read: %d",numBytes);
[[EMConnectionManager sharedManager] readResource:@"data" onSuccess:^(id readValue)
|
|
57
|
{
|
|
58
59
60
61
62
63
64
65
66
67
68
|
NSString *readData = [readValue substringToIndex:numBytes];
if([readValue length] < numBytes)
{
NSLog(@"[CommunicationProtocol.m]: WARNING: Device issued wrong numBytes, possible truncated message.");
}
[self.message appendString:readData];
NSLog(@"[CommunicationProtocol.m]: data read: %@",readData);
[[EMConnectionManager sharedManager] writeValue:@"0" toResource:@"messageAvailableDevice" onSuccess:^
{
NSLog(@"[CommunicationProtocol.m]: messageAvailableDevice set to FALSE");
NSLog(@"[CommunicationProtocol.m]: packet read");
|
|
69
|
[self waitForMessage: 0];
|
|
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On setMessageAvailableDevice to FALSE: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
}];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On readData: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
}];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On readNumBytes: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
}];
}
else
{
|
|
88
|
[[self delegate] processMessage:self didFinishEnteringItem:self.message];
|
|
89
90
91
|
}
}
|
|
92
|
- (void) readNumPackets
|
|
93
|
{
|
|
94
|
[[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
|
|
95
|
{
|
|
96
97
98
99
100
101
102
103
|
self.numPackets = [readValue unsignedCharValue];
NSLog(@"[CommunicationProtocol.m]: numPackets read: %d",self.numPackets);
[self readNextFragment];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On readNumPackets: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
}];
|
|
104
105
|
}
|
|
106
|
- (void) waitForMessage: (uint8_t) retries
|
|
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
|
if(retries == MAX_RETRIES)
{
NSLog(@"[CommunicationProtocol.m]: Device not ready.");
NSLog(@"[CommunicationProtocol.m]: Timeout while expecting message");
}
else
{
NSLog(@"[CommunicationProtocol.m]: Reading messageAvailable from device");
[[EMConnectionManager sharedManager] readResource:@"messageAvailableDevice" onSuccess:^(id readValue)
{
[self setMessageAvailableDevice:[readValue intValue]];
if(![self messageAvailableDevice])
{
NSLog(@"[CommunicationProtocol.m]: Device not ready. Retrying...");
[NSThread sleepForTimeInterval:SLEEP_TIME];
[self waitForMessage:retries + 1];
}
else
{
if(self.numPackets == -1)
{
[self readNumPackets];
}
else
{
[self readNextFragment];
}
}
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On waitForMessage: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
}];
}
|
|
142
143
|
}
|
|
144
|
-(void) writeMessage: (NSString*) message
|
|
145
|
{
|
|
146
147
148
149
|
NSLog(@"[CommunicationProtocol.m]: Sending message: %@",message);
[self setMessage:[NSMutableString stringWithString:message]];
[self setRemainingBytes:[message length]];
[self setCurrentIndex:0];
|
|
150
151
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
{
|
|
152
|
NSLog(@"[CommunicationProtocol.m]: numPackets set to %u",([message length]/MAX_STRING_LENGTH) + 1);
|
|
153
154
|
[self sendNextFragment];
}onFail:^(NSError *error)
|
|
155
|
{
|
|
156
157
158
159
160
161
162
163
164
|
NSLog(@"[CommunicationProtocol.m]: On setNumPackets: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
}];
}
- (void) sendNextFragment
{
NSLog(@"[CommunicationProtocol.m]: Sending next fragment");
[[EMConnectionManager sharedManager] writeValue:@"0" toResource:@"messageAvailableMobile" onSuccess:^
|
|
165
|
{
|
|
166
167
168
|
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile set to FALSE");
NSUInteger numBytes;
if(self.remainingBytes)
|
|
169
|
{
|
|
170
|
if(self.remainingBytes > MAX_STRING_LENGTH)
|
|
171
172
|
{
numBytes = MAX_STRING_LENGTH;
|
|
173
|
self.remainingBytes -= MAX_STRING_LENGTH;
|
|
174
175
176
|
}
else
{
|
|
177
178
|
numBytes = self.remainingBytes;
self.remainingBytes = 0;
|
|
179
|
}
|
|
180
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)numBytes] toResource:@"numBytes" onSuccess:^
|
|
181
|
{
|
|
182
|
NSLog(@"[CommunicationProtocol.m]: numBytes set to %d", numBytes);
|
|
183
184
185
186
187
188
189
190
191
|
NSString *data = [self.message substringWithRange:NSMakeRange(self.currentIndex, numBytes)];
self.currentIndex += numBytes;
[[EMConnectionManager sharedManager] writeValue:data toResource:@"data" onSuccess:^
{
NSLog(@"[CommunicationProtocol.m]: data set to: %@",data);
[[EMConnectionManager sharedManager] writeValue:@"1" toResource:@"messageAvailableMobile" onSuccess:^
{
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile set to TRUE");
NSLog(@"[CommunicationProtocol.m]: Packet written");
|
|
192
|
[self readACK: 0];
|
|
193
194
195
196
197
198
199
200
201
202
203
|
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On setMessageAvailable to TRUE: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
}];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On setData: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
}];
}onFail:^(NSError *error)
|
|
204
|
{
|
|
205
206
207
208
209
210
|
NSLog(@"[CommunicationProtocol.m]: On setNumBytes: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
}];
}
else
{
|
|
211
|
NSLog(@"[CommunicationProtocol.m]: Finished sending message");
|
|
212
213
214
215
216
217
218
219
220
221
|
[self readMessage];
}
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On setMessageAvailableMobile to FALSE: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
}];
}
|
|
222
|
- (void) readACK: (uint8_t) retries
|
|
223
|
{
|
|
224
|
if(retries == MAX_RETRIES)
|
|
225
|
{
|
|
226
227
228
229
230
231
232
|
NSLog(@"[CommunicationProtocol.m]: Device not ready.");
NSLog(@"[CommunicationProtocol.m]: Timeout while expecting ACK");
}
else
{
NSLog(@"[CommunicationProtocol.m]: Reading ACK from device");
[[EMConnectionManager sharedManager] readResource:@"messageAvailableMobile" onSuccess:^(id readValue)
|
|
233
|
{
|
|
234
235
|
[self setMessageAvailableMobile:[readValue intValue]];
if([self messageAvailableMobile])
|
|
236
|
{
|
|
237
238
239
240
241
|
NSLog(@"[CommunicationProtocol.m]: Device not ready. Retrying...");
[NSThread sleepForTimeInterval:SLEEP_TIME];
[self readACK:retries + 1];
}
else
|
|
242
|
{
|
|
243
244
245
|
[self sendNextFragment];
}
}onFail:^(NSError *error)
|
|
246
|
{
|
|
247
248
249
250
|
NSLog(@"[CommunicationProtocol.m]: On readACK: %@",error);
[self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
}];
}
|
|
251
252
|
}
|
|
253
|
-(void) establishConnection
|
|
254
|
{
|
|
255
|
NSLog(@"[CommunicationProtocol.m]: Establishing connection...");
|
|
256
257
|
[self writeMessage:@"Hello"];
NSLog(@"[CommunicationProtocol.m]: Hello sent");
|
|
258
259
|
}
|
|
260
|
-(void) updateTime: (NSDateComponents*) date
|
|
261
262
263
264
|
{
NSMutableString *command = [NSMutableString stringWithFormat: @"A5"];
NSInteger year = [date year];
year = year - (year/100)*100;
|
|
265
266
|
[command appendString:[NSString stringWithFormat:@"%02ld",(long)year]];
[command appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld%02ld",(long)[date month],(long)[date day],(long)[date hour],(long)[date minute],(long)[date second]]];
|
|
267
268
269
|
[self writeMessage:command];
}
|
|
270
|
-(void) updatePrice: (uint8_t) channel : (uint8_t) product : (uint8_t) eur : (uint8_t) cents
|
|
271
272
273
274
275
|
{
NSMutableString *command = [NSMutableString stringWithFormat: @"A6%01d%01d%02d%02d",channel,product,eur,cents];
[self writeMessage:command];
}
|
|
276
|
-(void) updateProductName: (uint8_t) channel : (uint8_t) product : (NSString*) name
|
|
277
278
279
280
281
282
283
284
285
|
{
if([name length] > MAX_PRODUCT_NAME_LENGTH)
{
name = [name substringToIndex:MAX_PRODUCT_NAME_LENGTH-1];
}
NSMutableString *command = [NSMutableString stringWithFormat: @"A7%01d%01d%@",channel,product,name];
[self writeMessage:command];
}
|
|
286
|
-(void) readSensorData
|
|
287
288
289
290
|
{
NSString *command = @"A4";
[self writeMessage:command];
|
|
291
|
/*NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P400015000150001500000001001003005002000001002"];
|
|
292
|
for(int i = 0; i < 4; i++)
|
|
293
294
|
{
[answer appendString:@"0"];
|
|
295
|
[answer appendString:@"1"];
|
|
296
|
}
|
|
297
|
for(int i = 0; i < 12; i++)
|
|
298
|
{
|
|
299
300
|
[answer appendString:@"0"];
[answer appendString:@"0"];
|
|
301
|
}
|
|
302
303
|
[answer appendString:@"0"];
|
|
304
|
[answer appendString:@"0"];*/
|
|
305
306
|
}
|
|
307
|
-(void) readSalesLog : (NSDateComponents*) start : (NSDateComponents*) end
|
|
308
|
{
|
|
309
310
|
NSMutableString *startDate = [NSMutableString stringWithString:@""];
NSMutableString *endDate = [NSMutableString stringWithString:@""];
|
|
311
312
313
314
315
316
317
|
NSMutableString *command = [NSMutableString stringWithString:@"A2"];
if(start == nil)
{
[startDate setString:@""];
}
else
{
|
|
318
319
320
321
|
NSInteger year = [start year];
year = year - (year/100)*100;
[startDate appendString:[NSString stringWithFormat:@"%02ld",(long)year]];
[startDate appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld",(long)[start month],(long)[start day],(long)[start hour],(long)[start minute]]];
|
|
322
323
324
325
326
327
328
|
}
if(end == nil)
{
[endDate setString:@""];
}
else
{
|
|
329
330
331
332
|
NSInteger year = [end year];
year = year - (year/100)*100;
[endDate appendString:[NSString stringWithFormat:@"%02ld",(long)year]];
[endDate appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld",(long)[end month],(long)[end day],(long)[end hour],(long)[end minute]]];
|
|
333
334
335
336
337
|
}
[command appendString:startDate];
[command appendString:@"-"];
[command appendString:endDate];
[self writeMessage:command];
|
|
338
|
|
|
339
|
//NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P21408161036000001000000110450000001P21409012216000100000000220900000100P21409032307000000010502330800000000P21409070540000000020000440350000001P2P2"];
|
|
340
341
|
}
|
|
342
|
@end
|