|
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) readMessage
|
|
37
|
{
|
|
38
|
[self setMessage:[NSMutableString stringWithFormat:@""]];
|
|
39
|
self.numPackets = -1;
|
|
40
|
[self waitForMessage: 0];
|
|
41
42
|
}
|
|
43
|
- (void) readNextFragment
|
|
44
|
{
|
|
45
|
__block NSUInteger numBytes;
|
|
46
|
[[EMConnectionManager sharedManager] readResource:@"numBytes" onSuccess:^(id readValue)
|
|
47
|
{
|
|
48
49
50
|
numBytes = [readValue unsignedCharValue];
NSLog(@"[CommunicationProtocol.m]: numBytes read: %d",numBytes);
[[EMConnectionManager sharedManager] readResource:@"data" onSuccess:^(id readValue)
|
|
51
|
{
|
|
52
53
|
NSString *readData = [readValue substringToIndex:numBytes];
if([readValue length] < numBytes)
|
|
54
|
{
|
|
55
56
57
58
59
60
61
62
63
64
|
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");
self.numPackets--;
if(self.numPackets)
|
|
65
|
{
|
|
66
|
[self waitForMessage: 0];
|
|
67
68
|
}
else
|
|
69
|
{
|
|
70
71
|
[[self delegate] processMessage:self didFinishEnteringItem:self.message];
}
|
|
72
73
|
}onFail:^(NSError *error)
{
|
|
74
75
|
NSLog(@"[CommunicationProtocol.m]: On setMessageAvailableDevice to FALSE: %@",error);
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
|
|
76
77
78
|
}];
}onFail:^(NSError *error)
{
|
|
79
80
|
NSLog(@"[CommunicationProtocol.m]: On readData: %@",error);
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
|
|
81
|
}];
|
|
82
|
}onFail:^(NSError *error)
|
|
83
|
{
|
|
84
85
86
|
NSLog(@"[CommunicationProtocol.m]: On readNumBytes: %@",error);
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
}];
|
|
87
88
|
}
|
|
89
|
- (void) readNumPackets
|
|
90
|
{
|
|
91
|
[[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
|
|
92
|
{
|
|
93
94
95
96
97
98
|
self.numPackets = [readValue unsignedCharValue];
NSLog(@"[CommunicationProtocol.m]: numPackets read: %d",self.numPackets);
[self readNextFragment];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On readNumPackets: %@",error);
|
|
99
|
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
|
|
100
|
}];
|
|
101
102
|
}
|
|
103
|
- (void) waitForMessage: (uint8_t) retries
|
|
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
|
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);
|
|
136
|
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
|
|
137
138
|
}];
}
|
|
139
140
|
}
|
|
141
|
-(void) writeMessage: (NSString*) message
|
|
142
|
{
|
|
143
144
145
146
|
NSLog(@"[CommunicationProtocol.m]: Sending message: %@",message);
[self setMessage:[NSMutableString stringWithString:message]];
[self setRemainingBytes:[message length]];
[self setCurrentIndex:0];
|
|
147
148
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
{
|
|
149
|
NSLog(@"[CommunicationProtocol.m]: numPackets set to %u",([message length]/MAX_STRING_LENGTH) + 1);
|
|
150
151
|
[self sendNextFragment];
}onFail:^(NSError *error)
|
|
152
|
{
|
|
153
|
NSLog(@"[CommunicationProtocol.m]: On setNumPackets: %@",error);
|
|
154
|
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
|
|
155
156
157
158
159
|
}];
}
- (void) sendNextFragment
{
|
|
160
|
if(self.remainingBytes)
|
|
161
|
{
|
|
162
|
NSLog(@"[CommunicationProtocol.m]: Sending next fragment");
|
|
163
|
NSUInteger numBytes;
|
|
164
|
if(self.remainingBytes > MAX_STRING_LENGTH)
|
|
165
|
{
|
|
166
167
|
numBytes = MAX_STRING_LENGTH;
self.remainingBytes -= MAX_STRING_LENGTH;
|
|
168
169
170
|
}
else
{
|
|
171
172
|
numBytes = self.remainingBytes;
self.remainingBytes = 0;
|
|
173
|
}
|
|
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)numBytes] toResource:@"numBytes" onSuccess:^
{
NSLog(@"[CommunicationProtocol.m]: numBytes set to %d", numBytes);
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");
[self readACK: 0];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On setMessageAvailable to TRUE: %@",error);
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
}];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On setData: %@",error);
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
}];
}onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: On setNumBytes: %@",error);
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
}];
}
else
|
|
204
|
{
|
|
205
206
207
|
NSLog(@"[CommunicationProtocol.m]: Finished sending message");
[self readMessage];
}
|
|
208
209
|
}
|
|
210
|
- (void) readACK: (uint8_t) retries
|
|
211
|
{
|
|
212
|
if(retries == MAX_RETRIES)
|
|
213
|
{
|
|
214
215
216
217
218
219
220
|
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)
|
|
221
|
{
|
|
222
223
|
[self setMessageAvailableMobile:[readValue intValue]];
if([self messageAvailableMobile])
|
|
224
|
{
|
|
225
226
227
228
229
|
NSLog(@"[CommunicationProtocol.m]: Device not ready. Retrying...");
[NSThread sleepForTimeInterval:SLEEP_TIME];
[self readACK:retries + 1];
}
else
|
|
230
|
{
|
|
231
232
233
|
[self sendNextFragment];
}
}onFail:^(NSError *error)
|
|
234
|
{
|
|
235
|
NSLog(@"[CommunicationProtocol.m]: On readACK: %@",error);
|
|
236
|
[[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
|
|
237
238
|
}];
}
|
|
239
240
|
}
|
|
241
|
-(void) establishConnection
|
|
242
|
{
|
|
243
|
NSLog(@"[CommunicationProtocol.m]: Establishing connection...");
|
|
244
245
|
[self writeMessage:@"Hello"];
NSLog(@"[CommunicationProtocol.m]: Hello sent");
|
|
246
247
|
}
|
|
248
249
250
251
252
253
254
|
-(void) disconnect
{
NSLog(@"[CommunicationProtocol.m]: Terminating connection...");
[self writeMessage:@"Bye"];
NSLog(@"[CommunicationProtocol.m]: Bye sent");
}
|
|
255
|
-(void) updateTime: (NSDateComponents*) date
|
|
256
257
258
259
|
{
NSMutableString *command = [NSMutableString stringWithFormat: @"A5"];
NSInteger year = [date year];
year = year - (year/100)*100;
|
|
260
261
|
[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]]];
|
|
262
263
264
|
[self writeMessage:command];
}
|
|
265
|
-(void) updatePrice: (uint8_t) channel : (uint8_t) product : (uint8_t) eur : (uint8_t) cents
|
|
266
267
268
269
270
|
{
NSMutableString *command = [NSMutableString stringWithFormat: @"A6%01d%01d%02d%02d",channel,product,eur,cents];
[self writeMessage:command];
}
|
|
271
|
-(void) updateProductName: (uint8_t) channel : (uint8_t) product : (NSString*) name
|
|
272
273
274
275
276
277
278
279
280
|
{
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];
}
|
|
281
|
-(void) readSensorData
|
|
282
283
284
285
|
{
NSString *command = @"A4";
[self writeMessage:command];
|
|
286
|
/*NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P4000150001500015000000010010030050020000010020101010100000000000000000000000000"];*/
|
|
287
288
|
}
|
|
289
|
-(void) readSalesLog : (NSDateComponents*) start : (NSDateComponents*) end
|
|
290
|
{
|
|
291
292
|
NSMutableString *startDate = [NSMutableString stringWithString:@""];
NSMutableString *endDate = [NSMutableString stringWithString:@""];
|
|
293
294
295
296
297
298
299
|
NSMutableString *command = [NSMutableString stringWithString:@"A2"];
if(start == nil)
{
[startDate setString:@""];
}
else
{
|
|
300
301
302
303
|
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]]];
|
|
304
305
306
307
308
309
310
|
}
if(end == nil)
{
[endDate setString:@""];
}
else
{
|
|
311
312
313
314
|
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]]];
|
|
315
316
317
318
319
|
}
[command appendString:startDate];
[command appendString:@"-"];
[command appendString:endDate];
[self writeMessage:command];
|
|
320
|
|
|
321
|
//NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P21408161036000001000000110450000001P21409012216000100000000220900000100P21409032307000000010502330800000000P21409070540000000020000440350000001P2P2"];
|
|
322
323
|
}
|
|
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
|
-(void) readIncidentLog:(NSDateComponents *)start :(NSDateComponents *)end
{
NSMutableString *startDate = [NSMutableString stringWithString:@""];
NSMutableString *endDate = [NSMutableString stringWithString:@""];
NSMutableString *command = [NSMutableString stringWithString:@"A3"];
if(start == nil)
{
[startDate setString:@""];
}
else
{
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]]];
}
if(end == nil)
{
[endDate setString:@""];
}
else
{
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]]];
}
[command appendString:startDate];
[command appendString:@"-"];
[command appendString:endDate];
[self writeMessage:command];
|
|
355
356
|
//@"P3140816103600012222P3140910093600023333P3140921103600034444P3140927103600045555P3P3"
|
|
357
358
|
}
|
|
359
360
361
362
363
364
|
/*-(void) testA9:(NSMutableString *)testString
{
NSMutableString *messageA9 = [[NSMutableString alloc] initWithString:@"A9"];
[messageA9 appendString:testString];
[self writeMessage:messageA9];
}*/
|
|
365
|
|
|
366
|
@end
|