Blame view

BT Vendor/CommunicationProtocol.m 13.9 KB
Imanol-Mikel Barba Sabariego authored
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 ()
Imanol-Mikel Barba Sabariego authored
13
14
@property Boolean messageAvailableMobile;
@property Boolean messageAvailableDevice;
Imanol-Mikel Barba Sabariego authored
15
16
17
18
@property NSMutableString *message;
@property NSUInteger currentIndex;
@property NSUInteger remainingBytes;
@property NSInteger numPackets;
Imanol-Mikel Barba Sabariego authored
19
Imanol-Mikel Barba Sabariego authored
20
21
22
23
@end

@implementation CommunicationProtocol
Imanol-Mikel Barba Sabariego authored
24
25
+ (id)sharedProtocol
{
Imanol-Mikel Barba Sabariego authored
26
27
28
29
    static CommunicationProtocol *shared = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        shared = [[self alloc] init];
Imanol-Mikel Barba Sabariego authored
30
31
        [shared setMessageAvailableDevice:FALSE];
        [shared setMessageAvailableMobile:FALSE];
Imanol-Mikel Barba Sabariego authored
32
33
34
35
    });
    return shared;
}
Imanol-Mikel Barba Sabariego authored
36
-(void) readMessage
Imanol-Mikel Barba Sabariego authored
37
{
Imanol-Mikel Barba Sabariego authored
38
    [self setMessage:[NSMutableString stringWithFormat:@""]];
Imanol-Mikel Barba Sabariego authored
39
    self.numPackets = -1;
Imanol-Mikel Barba Sabariego authored
40
    [self waitForMessage: 0];
Imanol-Mikel Barba Sabariego authored
41
42
}
Imanol-Mikel Barba Sabariego authored
43
- (void) readNextFragment
Imanol-Mikel Barba Sabariego authored
44
{
Imanol-Mikel Barba Sabariego authored
45
    __block NSUInteger numBytes;
Imanol-Mikel Barba Sabariego authored
46
    [[EMConnectionManager sharedManager] readResource:@"numBytes" onSuccess:^(id readValue)
Imanol-Mikel Barba Sabariego authored
47
    {
Imanol-Mikel Barba Sabariego authored
48
49
50
        numBytes = [readValue unsignedCharValue];
        NSLog(@"[CommunicationProtocol.m]: numBytes read: %d",numBytes);
        [[EMConnectionManager sharedManager] readResource:@"data" onSuccess:^(id readValue)
Imanol-Mikel Barba Sabariego authored
51
        {
Imanol-Mikel Barba Sabariego authored
52
53
54
55
56
57
            /*
             * BUG: If previously sent message is longer than the response, the excess bytes are appended to the response
             *      coming from the device. Trimming is applied to correct that. A possible cause may be a bug in the device's
             *      code, not the app
             */
            //NSString *readData = readValue;
Imanol-Mikel Barba Sabariego authored
58
59
            NSString *readData = [readValue substringToIndex:numBytes];
            if([readValue length] < numBytes)
Imanol-Mikel Barba Sabariego authored
60
            {
Imanol-Mikel Barba Sabariego authored
61
62
63
64
65
66
67
68
69
70
                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)
Imanol-Mikel Barba Sabariego authored
71
                {
Imanol-Mikel Barba Sabariego authored
72
                    [self waitForMessage: 0];
Imanol-Mikel Barba Sabariego authored
73
74
                }
                else
Imanol-Mikel Barba Sabariego authored
75
                {
Imanol-Mikel Barba Sabariego authored
76
77
                    [[self delegate] processMessage:self didFinishEnteringItem:self.message];
                }
Imanol-Mikel Barba Sabariego authored
78
79
            }onFail:^(NSError *error)
            {
Imanol-Mikel Barba Sabariego authored
80
81
                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]]];
Imanol-Mikel Barba Sabariego authored
82
83
84
            }];
        }onFail:^(NSError *error)
        {
Imanol-Mikel Barba Sabariego authored
85
86
            NSLog(@"[CommunicationProtocol.m]: On readData: %@",error);
            [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
87
        }];
Imanol-Mikel Barba Sabariego authored
88
    }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
89
    {
Imanol-Mikel Barba Sabariego authored
90
91
92
        NSLog(@"[CommunicationProtocol.m]: On readNumBytes: %@",error);
        [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
    }];
Imanol-Mikel Barba Sabariego authored
93
94
}
Imanol-Mikel Barba Sabariego authored
95
- (void) readNumPackets
Imanol-Mikel Barba Sabariego authored
96
{
Imanol-Mikel Barba Sabariego authored
97
    [[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
Imanol-Mikel Barba Sabariego authored
98
    {
Imanol-Mikel Barba Sabariego authored
99
100
101
102
103
104
        self.numPackets = [readValue unsignedCharValue];
        NSLog(@"[CommunicationProtocol.m]: numPackets read: %d",self.numPackets);
        [self readNextFragment];
    }onFail:^(NSError *error)
    {
        NSLog(@"[CommunicationProtocol.m]: On readNumPackets: %@",error);
Imanol-Mikel Barba Sabariego authored
105
        [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
106
    }];
Imanol-Mikel Barba Sabariego authored
107
108
}
Imanol-Mikel Barba Sabariego authored
109
- (void) waitForMessage: (uint8_t) retries
Imanol-Mikel Barba Sabariego authored
110
{
Imanol-Mikel Barba Sabariego authored
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);
Imanol-Mikel Barba Sabariego authored
142
            [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
143
144
        }];
    }
Imanol-Mikel Barba Sabariego authored
145
146
}
Imanol-Mikel Barba Sabariego authored
147
-(void) writeMessage: (NSString*) message
Imanol-Mikel Barba Sabariego authored
148
{
Imanol-Mikel Barba Sabariego authored
149
150
151
152
    NSLog(@"[CommunicationProtocol.m]: Sending message: %@",message);
    [self setMessage:[NSMutableString stringWithString:message]];
    [self setRemainingBytes:[message length]];
    [self setCurrentIndex:0];
Imanol-Mikel Barba Sabariego authored
153
154
    [[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
     {
Imanol-Mikel Barba Sabariego authored
155
         NSLog(@"[CommunicationProtocol.m]: numPackets set to %u",([message length]/MAX_STRING_LENGTH) + 1);
Imanol-Mikel Barba Sabariego authored
156
157
         [self sendNextFragment];
     }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
158
     {
Imanol-Mikel Barba Sabariego authored
159
         NSLog(@"[CommunicationProtocol.m]: On setNumPackets: %@",error);
Imanol-Mikel Barba Sabariego authored
160
            [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
161
162
163
164
165
     }];
}

- (void) sendNextFragment
{
Imanol-Mikel Barba Sabariego authored
166
    if(self.remainingBytes)
Imanol-Mikel Barba Sabariego authored
167
    {
Imanol-Mikel Barba Sabariego authored
168
        NSLog(@"[CommunicationProtocol.m]: Sending next fragment");
Imanol-Mikel Barba Sabariego authored
169
        NSUInteger numBytes;
Imanol-Mikel Barba Sabariego authored
170
        if(self.remainingBytes > MAX_STRING_LENGTH)
Imanol-Mikel Barba Sabariego authored
171
        {
Imanol-Mikel Barba Sabariego authored
172
173
            numBytes = MAX_STRING_LENGTH;
            self.remainingBytes -= MAX_STRING_LENGTH;
Imanol-Mikel Barba Sabariego authored
174
175
176
        }
        else
        {
Imanol-Mikel Barba Sabariego authored
177
178
            numBytes = self.remainingBytes;
            self.remainingBytes = 0;
Imanol-Mikel Barba Sabariego authored
179
        }
Imanol-Mikel Barba Sabariego authored
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
        [[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
Imanol-Mikel Barba Sabariego authored
210
    {
Imanol-Mikel Barba Sabariego authored
211
212
213
        NSLog(@"[CommunicationProtocol.m]: Finished sending message");
        [self readMessage];
    }
Imanol-Mikel Barba Sabariego authored
214
215
}
Imanol-Mikel Barba Sabariego authored
216
- (void) readACK: (uint8_t) retries
Imanol-Mikel Barba Sabariego authored
217
{
Imanol-Mikel Barba Sabariego authored
218
    if(retries == MAX_RETRIES)
Imanol-Mikel Barba Sabariego authored
219
    {
Imanol-Mikel Barba Sabariego authored
220
221
222
223
224
225
226
        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)
Imanol-Mikel Barba Sabariego authored
227
        {
Imanol-Mikel Barba Sabariego authored
228
229
            [self setMessageAvailableMobile:[readValue intValue]];
            if([self messageAvailableMobile])
Imanol-Mikel Barba Sabariego authored
230
            {
Imanol-Mikel Barba Sabariego authored
231
232
233
234
235
                NSLog(@"[CommunicationProtocol.m]: Device not ready. Retrying...");
                [NSThread sleepForTimeInterval:SLEEP_TIME];
                [self readACK:retries + 1];
            }
            else
Imanol-Mikel Barba Sabariego authored
236
            {
Imanol-Mikel Barba Sabariego authored
237
238
239
                [self sendNextFragment];
            }
        }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
240
        {
Imanol-Mikel Barba Sabariego authored
241
            NSLog(@"[CommunicationProtocol.m]: On readACK: %@",error);
Imanol-Mikel Barba Sabariego authored
242
            [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
243
244
        }];
    }
Imanol-Mikel Barba Sabariego authored
245
246
}
Imanol-Mikel Barba Sabariego authored
247
-(void) establishConnection
Imanol-Mikel Barba Sabariego authored
248
{
Imanol-Mikel Barba Sabariego authored
249
    NSLog(@"[CommunicationProtocol.m]: Establishing connection...");
Imanol-Mikel Barba Sabariego authored
250
251
    [self writeMessage:@"Hello"];
    NSLog(@"[CommunicationProtocol.m]: Hello sent");
Imanol-Mikel Barba Sabariego authored
252
253
}
Imanol-Mikel Barba Sabariego authored
254
255
256
257
258
259
260
-(void) disconnect
{
    NSLog(@"[CommunicationProtocol.m]: Terminating connection...");
    [self writeMessage:@"Bye"];
    NSLog(@"[CommunicationProtocol.m]: Bye sent");
}
Imanol-Mikel Barba Sabariego authored
261
-(void) updateTime: (NSDateComponents*) date
Imanol-Mikel Barba Sabariego authored
262
263
264
265
{
    NSMutableString *command = [NSMutableString stringWithFormat: @"A5"];
    NSInteger year = [date year];
    year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
266
    [command appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld%02ld%02ld",(long)year,(long)[date month],(long)[date day],(long)[date hour],(long)[date minute],(long)[date second]]];
Imanol-Mikel Barba Sabariego authored
267
268
269
    [self writeMessage:command];
}
Imanol-Mikel Barba Sabariego authored
270
-(void) updatePrice: (uint8_t) channel : (uint8_t) product : (uint8_t) eur : (uint8_t) cents
Imanol-Mikel Barba Sabariego authored
271
272
273
274
275
{
    NSMutableString *command = [NSMutableString stringWithFormat: @"A6%01d%01d%02d%02d",channel,product,eur,cents];
    [self writeMessage:command];
}
Imanol-Mikel Barba Sabariego authored
276
-(void) updateProductName: (uint8_t) channel : (uint8_t) product : (NSString*) name
Imanol-Mikel Barba Sabariego authored
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];
}
Imanol-Mikel Barba Sabariego authored
286
-(void) readSensorData
Imanol-Mikel Barba Sabariego authored
287
288
289
{
    NSString *command = @"A4";
    [self writeMessage:command];
Imanol-Mikel Barba Sabariego authored
290
291
}
Imanol-Mikel Barba Sabariego authored
292
-(void) readSalesLog : (NSDateComponents*) start : (NSDateComponents*) end
Imanol-Mikel Barba Sabariego authored
293
{
Imanol-Mikel Barba Sabariego authored
294
295
    NSMutableString *startDate = [NSMutableString stringWithString:@""];
    NSMutableString *endDate = [NSMutableString stringWithString:@""];
Imanol-Mikel Barba Sabariego authored
296
297
298
299
300
301
302
    NSMutableString *command = [NSMutableString stringWithString:@"A2"];
    if(start == nil)
    {
        [startDate setString:@""];
    }
    else
    {
Imanol-Mikel Barba Sabariego authored
303
304
        NSInteger year = [start year];
        year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
305
        [startDate appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld%02ld",(long)year,(long)[start month],(long)[start day],(long)[start hour],(long)[start minute]]];
Imanol-Mikel Barba Sabariego authored
306
307
308
309
310
311
312
    }
    if(end == nil)
    {
        [endDate setString:@""];
    }
    else
    {
Imanol-Mikel Barba Sabariego authored
313
314
        NSInteger year = [end year];
        year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
315
        [endDate appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld%02ld",(long)year,(long)[end month],(long)[end day],(long)[end hour],(long)[end minute]]];
Imanol-Mikel Barba Sabariego authored
316
317
318
319
320
    }
    [command appendString:startDate];
    [command appendString:@"-"];
    [command appendString:endDate];
    [self writeMessage:command];
Imanol-Mikel Barba Sabariego authored
321
322
}
Imanol-Mikel Barba Sabariego authored
323
324
325
326
327
328
329
330
331
332
333
334
335
-(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;
Imanol-Mikel Barba Sabariego authored
336
        [startDate appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld%02ld",(long)year,(long)[start month],(long)[start day],(long)[start hour],(long)[start minute]]];
Imanol-Mikel Barba Sabariego authored
337
338
339
340
341
342
343
344
345
    }
    if(end == nil)
    {
        [endDate setString:@""];
    }
    else
    {
        NSInteger year = [end year];
        year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
346
        [endDate appendString:[NSString stringWithFormat:@"%02ld%02ld%02ld%02ld%02ld",(long)year,(long)[end month],(long)[end day],(long)[end hour],(long)[end minute]]];
Imanol-Mikel Barba Sabariego authored
347
348
349
350
351
352
353
    }
    [command appendString:startDate];
    [command appendString:@"-"];
    [command appendString:endDate];
    [self writeMessage:command];
}
Imanol-Mikel Barba Sabariego authored
354
@end