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