|
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
|
//
// 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
+ (id)sharedProtocol {
static CommunicationProtocol *shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
shared = [[self alloc] init];
});
return shared;
}
|
|
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
|
-(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);
}];
[NSThread sleepForTimeInterval:10];
}
-(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);
}];
[NSThread sleepForTimeInterval:10];
}
-(Boolean) waitForMessageAvailableMobile: (Boolean) status
|
|
69
70
|
{
uint8_t retries = 0;
|
|
71
72
|
[self readMessageAvailableMobile];
while([self messageAvailableMobile] != status)
|
|
73
74
|
{
[NSThread sleepForTimeInterval:5];
|
|
75
76
|
[self readMessageAvailableMobile];
if([self messageAvailableMobile] != status)
|
|
77
78
79
|
{
if(retries++ == MAX_RETRIES)
{
|
|
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
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");
|
|
101
102
103
104
105
106
107
108
109
110
|
return FALSE;
}
}
}
return TRUE;
}
-(NSString*) readMessage
{
__block uint8_t numPackets, numBytes;
|
|
111
|
__block NSMutableString *message = [[NSMutableString alloc] init];
|
|
112
|
[message setString:@""];
|
|
113
114
|
if([self waitForMessageAvailableDevice:TRUE])
//if(1) //HACK!
|
|
115
116
117
118
|
{
[[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
{
numPackets = (uint8_t) [readValue unsignedCharValue];
|
|
119
|
NSLog(@"[CommunicationProtocol.m]: numPackets read: %d",numPackets);
|
|
120
121
122
|
}
onFail:^(NSError *error)
{
|
|
123
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
124
125
126
127
128
129
|
numPackets = 0;
}];
if(numPackets)
{
for(int i = 0; i < numPackets; i++)
{
|
|
130
131
|
if([self waitForMessageAvailableDevice:TRUE])
//if(1)//HACK!
|
|
132
|
{
|
|
133
|
[[EMConnectionManager sharedManager] readResource:@"numBytes" onSuccess:^(id readValue)
|
|
134
|
{
|
|
135
136
|
numBytes = (uint8_t) [readValue unsignedCharValue];
NSLog(@"[CommunicationProtocol.m]: numBytes read: %d",numBytes);
|
|
137
138
139
|
}
onFail:^(NSError *error)
{
|
|
140
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
141
|
numBytes = 0;
|
|
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
169
|
if(numBytes)
{
[[EMConnectionManager sharedManager] readResource:@"data" onSuccess:^(id readValue)
{
[message appendString: readValue];
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
|
[[EMConnectionManager sharedManager] writeValue:@"0" toResource:@"messageAvailableDevice" onSuccess:^
|
|
175
|
{
|
|
176
177
|
NSLog(@"[CommunicationProtocol.m]: messageAvailableDevice set to FALSE");
NSLog(@"[CommunicationProtocol.m]: Message received: %@",message);
|
|
178
179
180
|
}
onFail:^(NSError *error)
{
|
|
181
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
182
183
|
}
];
|
|
184
|
NSLog(@"[CommunicationProtocol.m]: Message received: %@",message);
|
|
185
186
187
188
189
190
191
|
return message;
}
-(Boolean) writeMessage: (NSString*) message
{
unsigned long remainingBytes = [message length];
uint8_t numBytes, current_index = 0;
|
|
192
193
194
195
196
197
198
199
200
201
202
203
|
__block Boolean status = TRUE;
[[EMConnectionManager sharedManager] writeValue:@"0" toResource:@"messageAvailableMobile" onSuccess:^
{
status = TRUE;
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile set to FALSE");
}
onFail:^(NSError *error)
{
NSLog(@"[CommunicationProtocol.m]: %@",error);
status = FALSE;
}
];
|
|
204
205
206
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
{
status = TRUE;
|
|
207
208
|
NSLog(@"[CommunicationProtocol.m]: numPackets set to %d",([message length]/MAX_STRING_LENGTH) + 1);
NSLog(@"[CommunicationProtocol.m]: new status is: %d",status);
|
|
209
210
211
|
}
onFail:^(NSError *error)
{
|
|
212
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
213
214
215
|
status = FALSE;
}
];
|
|
216
|
NSLog(@"[CommunicationProtocol.m]: status is: %d",status);
|
|
217
218
|
if(status != FALSE)
{
|
|
219
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after numPackets...");
|
|
220
221
|
while(remainingBytes)
{
|
|
222
|
if(![self waitForMessageAvailableMobile:FALSE])
|
|
223
224
225
226
|
{
status = FALSE;
break;
}
|
|
227
|
NSLog(@"[CommunicationProtocol.m]: Device is ready for next packet");
|
|
228
229
230
231
232
233
234
235
236
237
|
if(remainingBytes > MAX_STRING_LENGTH)
{
numBytes = MAX_STRING_LENGTH;
remainingBytes -= MAX_STRING_LENGTH;
}
else
{
numBytes = remainingBytes;
remainingBytes = 0;
}
|
|
238
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)numBytes] toResource:@"numBytes" onSuccess:^
|
|
239
|
{
|
|
240
|
NSLog(@"[CommunicationProtocol.m]: numBytes set to %d", numBytes);
|
|
241
242
243
244
|
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
245
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
246
247
248
249
250
|
status = FALSE;
}
];
if(status != FALSE)
{
|
|
251
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after numBytes...");
|
|
252
253
254
255
|
NSString *data = [message substringWithRange:NSMakeRange(current_index, numBytes)];
current_index += numBytes;
[[EMConnectionManager sharedManager] writeValue:data toResource:@"data" onSuccess:^
{
|
|
256
|
NSLog(@"[CommunicationProtocol.m]: data set to: %@",data);
|
|
257
258
259
260
|
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
261
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
262
263
264
265
266
|
status = FALSE;
}
];
if(status != FALSE)
{
|
|
267
268
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after data...");
[[EMConnectionManager sharedManager] writeValue:@"1" toResource:@"messageAvailableMobile" onSuccess:^
|
|
269
270
|
{
status = TRUE;
|
|
271
272
|
NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile set to TRUE");
NSLog(@"[CommunicationProtocol.m]: Message written");
|
|
273
274
275
|
}
onFail:^(NSError *error)
{
|
|
276
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
277
278
279
|
status = FALSE;
}
];
|
|
280
|
NSLog(@"[CommunicationProtocol.m]: Carrying on after messageAvailableMobile...");
|
|
281
282
283
284
|
}
}
}
}
|
|
285
|
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
304
|
NSLog(@"[CommunicationProtocol.m]: Error while establishing connection");
return TRUE;
|
|
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
|