|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//
// 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 ()
@end
@implementation CommunicationProtocol
|
|
17
18
|
+ (id)sharedProtocol
{
|
|
19
20
21
22
23
24
25
26
|
static CommunicationProtocol *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[self alloc] init];
});
return shared;
}
|
|
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
|
-(void) readMessageAvailableMobile
{
[[EMConnectionManager sharedManager] readResource:@"messageAvailableMobile" onSuccess:^(id readValue)
{
[self setMessageAvailableMobile:[readValue intValue]];
if([self messageAvailableMobile])
{
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile read: TRUE");
}
else
{
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile read: FALSE");
}
}
onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: %@",error);
}];
}
-(void) readMessageAvailableDevice
{
[[EMConnectionManager sharedManager] readResource:@"messageAvailableDevice" onSuccess:^(id readValue)
{
[self setMessageAvailableDevice:[readValue intValue]];
if([self messageAvailableDevice])
{
NSLog(@"[CommunicationProtocol.m]: messageAvailableDevice read: TRUE");
}
else
{
NSLog(@"[CommunicationProtocol.m]: messageAvailableDevice read: FALSE");
}
}
onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: %@",error);
}];
}
-(Boolean) waitForMessageAvailableMobile: (Boolean) status
|
|
68
69
|
{
uint8_t retries = 0;
|
|
70
71
|
[self readMessageAvailableMobile];
while([self messageAvailableMobile] != status)
|
|
72
73
|
{
[NSThread sleepForTimeInterval:5];
|
|
74
75
|
[self readMessageAvailableMobile];
if([self messageAvailableMobile] != status)
|
|
76
77
78
|
{
if(retries++ == MAX_RETRIES)
{
|
|
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
NSLog(@"[CommunicationProtocol.m]: Timeout while waiting for answer");
return FALSE;
}
}
}
return TRUE;
}
-(Boolean) waitForMessageAvailableDevice: (Boolean) status
{
uint8_t retries = 0;
[self readMessageAvailableDevice];
while([self messageAvailableDevice] != status)
{
[NSThread sleepForTimeInterval:5];
[self readMessageAvailableDevice];
if([self messageAvailableDevice] != status)
{
if(retries++ == MAX_RETRIES)
{
NSLog(@"[CommunicationProtocol.m]: Timeout while waiting for answer");
|
|
100
101
102
103
104
105
106
107
108
|
return FALSE;
}
}
}
return TRUE;
}
-(NSString*) readMessage
{
|
|
109
|
__block uint8_t numPackets = 1, numBytes; //HACK!
|
|
110
|
__block NSMutableString *message = [[NSMutableString alloc] init];
|
|
111
|
[message setString:@""];
|
|
112
113
|
//if([self waitForMessageAvailableDevice:TRUE])
if(1) //HACK!
|
|
114
115
116
117
|
{
[[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
{
numPackets = (uint8_t) [readValue unsignedCharValue];
|
|
118
|
NSLog(@"[CommunicationProtocol.m]: numPackets read: %d",numPackets);
|
|
119
120
121
|
}
onFail:^(NSError *error)
{
|
|
122
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
123
124
125
126
127
128
|
numPackets = 0;
}];
if(numPackets)
{
for(int i = 0; i < numPackets; i++)
{
|
|
129
130
|
//if([self waitForMessageAvailableDevice:TRUE])
if(1)//HACK!
|
|
131
|
{
|
|
132
|
[[EMConnectionManager sharedManager] readResource:@"numBytes" onSuccess:^(id readValue)
|
|
133
|
{
|
|
134
135
|
numBytes = (uint8_t) [readValue unsignedCharValue];
NSLog(@"[CommunicationProtocol.m]: numBytes read: %d",numBytes);
|
|
136
137
138
|
}
onFail:^(NSError *error)
{
|
|
139
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
140
|
numBytes = 0;
|
|
141
|
}];
|
|
142
143
144
145
146
|
if(numBytes)
{
[[EMConnectionManager sharedManager] readResource:@"data" onSuccess:^(id readValue)
{
[message appendString: readValue];
|
|
147
|
[message setString: [message substringToIndex:numBytes]];
|
|
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
NSLog(@"[CommunicationProtocol.m]: data read: %@",message);
}
onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: %@",error);
}];
}
[[EMConnectionManager sharedManager] writeValue:@"0" toResource:@"messageAvailableDevice" onSuccess:^
{
NSLog(@"[CommunicationProtocol.m]: messageAvailableDevice set to FALSE");
NSLog(@"[CommunicationProtocol.m]: packet read");
}
onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: %@",error);
}
];
}
else
{
NSLog(@"[CommunicationProtocol.m]: Error, resetting message");
[message setString:@""];
|
|
170
171
172
173
|
}
}
}
}
|
|
174
|
NSLog(@"[CommunicationProtocol.m]: Message received: %@",message);
|
|
175
176
177
178
179
180
181
|
return message;
}
-(Boolean) writeMessage: (NSString*) message
{
unsigned long remainingBytes = [message length];
uint8_t numBytes, current_index = 0;
|
|
182
183
|
__block Boolean status = TRUE; //HACK
__block Boolean blockCompleted = TRUE; //HACK!
|
|
184
185
186
187
|
[[EMConnectionManager sharedManager] writeValue:@"0" toResource:@"messageAvailableMobile" onSuccess:^
{
status = TRUE;
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile set to FALSE");
|
|
188
|
blockCompleted = TRUE;
|
|
189
190
191
192
193
|
}
onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: %@",error);
status = FALSE;
|
|
194
195
196
197
198
199
200
201
|
blockCompleted = TRUE;
}];
while(blockCompleted != TRUE)
{
[NSThread sleepForTimeInterval:1];
}
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile write block completed");
blockCompleted = FALSE;
|
|
202
203
204
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
{
status = TRUE;
|
|
205
|
NSLog(@"[CommunicationProtocol.m]: numPackets set to %d",([message length]/MAX_STRING_LENGTH) + 1);
|
|
206
207
208
|
}
onFail:^(NSError *error)
{
|
|
209
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
210
211
212
|
status = FALSE;
}
];
|
|
213
|
NSLog(@"[CommunicationProtocol.m]: status is: %d",status);
|
|
214
215
|
if(status != FALSE)
{
|
|
216
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after numPackets...");
|
|
217
218
|
while(remainingBytes)
{
|
|
219
|
if(![self waitForMessageAvailableMobile:FALSE])
|
|
220
221
222
223
|
{
status = FALSE;
break;
}
|
|
224
|
NSLog(@"[CommunicationProtocol.m]: Device is ready for next packet");
|
|
225
226
227
228
229
230
231
232
233
234
|
if(remainingBytes > MAX_STRING_LENGTH)
{
numBytes = MAX_STRING_LENGTH;
remainingBytes -= MAX_STRING_LENGTH;
}
else
{
numBytes = remainingBytes;
remainingBytes = 0;
}
|
|
235
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)numBytes] toResource:@"numBytes" onSuccess:^
|
|
236
|
{
|
|
237
|
NSLog(@"[CommunicationProtocol.m]: numBytes set to %d", numBytes);
|
|
238
239
240
241
|
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
242
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
243
244
245
246
247
|
status = FALSE;
}
];
if(status != FALSE)
{
|
|
248
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after numBytes...");
|
|
249
250
251
252
|
NSString *data = [message substringWithRange:NSMakeRange(current_index, numBytes)];
current_index += numBytes;
[[EMConnectionManager sharedManager] writeValue:data toResource:@"data" onSuccess:^
{
|
|
253
|
NSLog(@"[CommunicationProtocol.m]: data set to: %@",data);
|
|
254
255
256
257
|
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
258
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
259
260
261
262
263
|
status = FALSE;
}
];
if(status != FALSE)
{
|
|
264
265
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after data...");
[[EMConnectionManager sharedManager] writeValue:@"1" toResource:@"messageAvailableMobile" onSuccess:^
|
|
266
267
|
{
status = TRUE;
|
|
268
|
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile set to TRUE");
|
|
269
|
NSLog(@"[CommunicationProtocol.m]: Packet written");
|
|
270
271
272
|
}
onFail:^(NSError *error)
{
|
|
273
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
274
275
276
|
status = FALSE;
}
];
|
|
277
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after messageAvailableMobile...");
|
|
278
279
280
281
|
}
}
}
}
|
|
282
283
284
285
|
if(![self waitForMessageAvailableMobile:FALSE])
{
NSLog(@"[CommunicationProtocol.m]: Device has processed the message");
}
|
|
286
287
288
289
290
|
return status;
}
-(Boolean) establishConnection
{
|
|
291
|
NSLog(@"[CommunicationProtocol.m]: Establishing connection...");
|
|
292
293
|
if([self writeMessage:@"Hello"])
{
|
|
294
|
NSLog(@"[CommunicationProtocol.m]: Hello sent");
|
|
295
|
NSString *answer = [self readMessage];
|
|
296
|
NSLog(@"[CommunicationProtocol.m]: Answer received");
|
|
297
298
|
if([answer isEqualToString:@"Hello"])
{
|
|
299
|
NSLog(@"[CommunicationProtocol.m]: Connection established");
|
|
300
301
302
|
return TRUE;
}
}
|
|
303
|
NSLog(@"[CommunicationProtocol.m]: Error while establishing connection");
|
|
304
|
return TRUE; //HACK!
|
|
305
306
|
}
|
|
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
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
355
356
|
-(Boolean) updateTime: (NSDateComponents*) date
{
if(date == nil)
{
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
date = [calendar components:units fromDate:[NSDate date]];
}
NSMutableString *command = [NSMutableString stringWithFormat: @"A5"];
NSInteger year = [date year];
year = year - (year/100)*100;
[command appendString:[NSString stringWithFormat:@"%02d",year]];
[command appendString:[NSString stringWithFormat:@"%02d%02d%02d%02d%02d",[date month],[date day],[date hour],[date minute],[date second]]];
[self writeMessage:command];
NSString *answer = [self readMessage];
if([answer isEqualToString:@"P51"])
{
return TRUE;
}
return FALSE;
}
-(Boolean) updatePrice: (uint8_t) channel : (uint8_t) product : (uint8_t) eur : (uint8_t) cents
{
NSMutableString *command = [NSMutableString stringWithFormat: @"A6%01d%01d%02d%02d",channel,product,eur,cents];
[self writeMessage:command];
NSString *answer = [self readMessage];
if([answer isEqualToString:@"P61"])
{
return TRUE;
}
return FALSE;
}
-(Boolean) updateProductName: (uint8_t) channel : (uint8_t) product : (NSString*) name
{
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];
NSString *answer = [self readMessage];
if([answer isEqualToString:@"P71"])
{
return TRUE;
}
return FALSE;
}
|
|
357
|
@end
|