Blame view

BT Vendor/CommunicationProtocol.m 13.6 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
            NSString *readData = [readValue substringToIndex:numBytes];
            if([readValue length] < numBytes)
Imanol-Mikel Barba Sabariego authored
54
            {
Imanol-Mikel Barba Sabariego authored
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)
Imanol-Mikel Barba Sabariego authored
65
                {
Imanol-Mikel Barba Sabariego authored
66
                    [self waitForMessage: 0];
Imanol-Mikel Barba Sabariego authored
67
68
                }
                else
Imanol-Mikel Barba Sabariego authored
69
                {
Imanol-Mikel Barba Sabariego authored
70
71
                    [[self delegate] processMessage:self didFinishEnteringItem:self.message];
                }
Imanol-Mikel Barba Sabariego authored
72
73
            }onFail:^(NSError *error)
            {
Imanol-Mikel Barba Sabariego authored
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]]];
Imanol-Mikel Barba Sabariego authored
76
77
78
            }];
        }onFail:^(NSError *error)
        {
Imanol-Mikel Barba Sabariego authored
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]]];
Imanol-Mikel Barba Sabariego authored
81
        }];
Imanol-Mikel Barba Sabariego authored
82
    }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
83
    {
Imanol-Mikel Barba Sabariego authored
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]]];
    }];
Imanol-Mikel Barba Sabariego authored
87
88
}
Imanol-Mikel Barba Sabariego authored
89
- (void) readNumPackets
Imanol-Mikel Barba Sabariego authored
90
{
Imanol-Mikel Barba Sabariego authored
91
    [[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
Imanol-Mikel Barba Sabariego authored
92
    {
Imanol-Mikel Barba Sabariego authored
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);
Imanol-Mikel Barba Sabariego authored
99
        [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
100
    }];
Imanol-Mikel Barba Sabariego authored
101
102
}
Imanol-Mikel Barba Sabariego authored
103
- (void) waitForMessage: (uint8_t) retries
Imanol-Mikel Barba Sabariego authored
104
{
Imanol-Mikel Barba Sabariego authored
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);
Imanol-Mikel Barba Sabariego authored
136
            [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while reading answer from device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
137
138
        }];
    }
Imanol-Mikel Barba Sabariego authored
139
140
}
Imanol-Mikel Barba Sabariego authored
141
-(void) writeMessage: (NSString*) message
Imanol-Mikel Barba Sabariego authored
142
{
Imanol-Mikel Barba Sabariego authored
143
144
145
146
    NSLog(@"[CommunicationProtocol.m]: Sending message: %@",message);
    [self setMessage:[NSMutableString stringWithString:message]];
    [self setRemainingBytes:[message length]];
    [self setCurrentIndex:0];
Imanol-Mikel Barba Sabariego authored
147
148
    [[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
     {
Imanol-Mikel Barba Sabariego authored
149
         NSLog(@"[CommunicationProtocol.m]: numPackets set to %u",([message length]/MAX_STRING_LENGTH) + 1);
Imanol-Mikel Barba Sabariego authored
150
151
         [self sendNextFragment];
     }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
152
     {
Imanol-Mikel Barba Sabariego authored
153
         NSLog(@"[CommunicationProtocol.m]: On setNumPackets: %@",error);
Imanol-Mikel Barba Sabariego authored
154
            [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
155
156
157
158
159
     }];
}

- (void) sendNextFragment
{
Imanol-Mikel Barba Sabariego authored
160
    if(self.remainingBytes)
Imanol-Mikel Barba Sabariego authored
161
    {
Imanol-Mikel Barba Sabariego authored
162
        NSLog(@"[CommunicationProtocol.m]: Sending next fragment");
Imanol-Mikel Barba Sabariego authored
163
        NSUInteger numBytes;
Imanol-Mikel Barba Sabariego authored
164
        if(self.remainingBytes > MAX_STRING_LENGTH)
Imanol-Mikel Barba Sabariego authored
165
        {
Imanol-Mikel Barba Sabariego authored
166
167
            numBytes = MAX_STRING_LENGTH;
            self.remainingBytes -= MAX_STRING_LENGTH;
Imanol-Mikel Barba Sabariego authored
168
169
170
        }
        else
        {
Imanol-Mikel Barba Sabariego authored
171
172
            numBytes = self.remainingBytes;
            self.remainingBytes = 0;
Imanol-Mikel Barba Sabariego authored
173
        }
Imanol-Mikel Barba Sabariego authored
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
Imanol-Mikel Barba Sabariego authored
204
    {
Imanol-Mikel Barba Sabariego authored
205
206
207
        NSLog(@"[CommunicationProtocol.m]: Finished sending message");
        [self readMessage];
    }
Imanol-Mikel Barba Sabariego authored
208
209
}
Imanol-Mikel Barba Sabariego authored
210
- (void) readACK: (uint8_t) retries
Imanol-Mikel Barba Sabariego authored
211
{
Imanol-Mikel Barba Sabariego authored
212
    if(retries == MAX_RETRIES)
Imanol-Mikel Barba Sabariego authored
213
    {
Imanol-Mikel Barba Sabariego authored
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)
Imanol-Mikel Barba Sabariego authored
221
        {
Imanol-Mikel Barba Sabariego authored
222
223
            [self setMessageAvailableMobile:[readValue intValue]];
            if([self messageAvailableMobile])
Imanol-Mikel Barba Sabariego authored
224
            {
Imanol-Mikel Barba Sabariego authored
225
226
227
228
229
                NSLog(@"[CommunicationProtocol.m]: Device not ready. Retrying...");
                [NSThread sleepForTimeInterval:SLEEP_TIME];
                [self readACK:retries + 1];
            }
            else
Imanol-Mikel Barba Sabariego authored
230
            {
Imanol-Mikel Barba Sabariego authored
231
232
233
                [self sendNextFragment];
            }
        }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
234
        {
Imanol-Mikel Barba Sabariego authored
235
            NSLog(@"[CommunicationProtocol.m]: On readACK: %@",error);
Imanol-Mikel Barba Sabariego authored
236
            [[self delegate] reportProtocolError:self didFinishEnteringItem:[NSString stringWithFormat:@"%@: %@",NSLocalizedString(@"Error occurred while sending command to device",nil),[error localizedDescription]]];
Imanol-Mikel Barba Sabariego authored
237
238
        }];
    }
Imanol-Mikel Barba Sabariego authored
239
240
}
Imanol-Mikel Barba Sabariego authored
241
-(void) establishConnection
Imanol-Mikel Barba Sabariego authored
242
{
Imanol-Mikel Barba Sabariego authored
243
    NSLog(@"[CommunicationProtocol.m]: Establishing connection...");
Imanol-Mikel Barba Sabariego authored
244
245
    [self writeMessage:@"Hello"];
    NSLog(@"[CommunicationProtocol.m]: Hello sent");
Imanol-Mikel Barba Sabariego authored
246
247
}
Imanol-Mikel Barba Sabariego authored
248
249
250
251
252
253
254
-(void) disconnect
{
    NSLog(@"[CommunicationProtocol.m]: Terminating connection...");
    [self writeMessage:@"Bye"];
    NSLog(@"[CommunicationProtocol.m]: Bye sent");
}
Imanol-Mikel Barba Sabariego authored
255
-(void) updateTime: (NSDateComponents*) date
Imanol-Mikel Barba Sabariego authored
256
257
258
259
{
    NSMutableString *command = [NSMutableString stringWithFormat: @"A5"];
    NSInteger year = [date year];
    year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
260
    [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
261
262
263
    [self writeMessage:command];
}
Imanol-Mikel Barba Sabariego authored
264
-(void) updatePrice: (uint8_t) channel : (uint8_t) product : (uint8_t) eur : (uint8_t) cents
Imanol-Mikel Barba Sabariego authored
265
266
267
268
269
{
    NSMutableString *command = [NSMutableString stringWithFormat: @"A6%01d%01d%02d%02d",channel,product,eur,cents];
    [self writeMessage:command];
}
Imanol-Mikel Barba Sabariego authored
270
-(void) updateProductName: (uint8_t) channel : (uint8_t) product : (NSString*) name
Imanol-Mikel Barba Sabariego authored
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];
}
Imanol-Mikel Barba Sabariego authored
280
-(void) readSensorData
Imanol-Mikel Barba Sabariego authored
281
282
283
{
    NSString *command = @"A4";
    [self writeMessage:command];
Imanol-Mikel Barba Sabariego authored
284
285
}
Imanol-Mikel Barba Sabariego authored
286
-(void) readSalesLog : (NSDateComponents*) start : (NSDateComponents*) end
Imanol-Mikel Barba Sabariego authored
287
{
Imanol-Mikel Barba Sabariego authored
288
289
    NSMutableString *startDate = [NSMutableString stringWithString:@""];
    NSMutableString *endDate = [NSMutableString stringWithString:@""];
Imanol-Mikel Barba Sabariego authored
290
291
292
293
294
295
296
    NSMutableString *command = [NSMutableString stringWithString:@"A2"];
    if(start == nil)
    {
        [startDate setString:@""];
    }
    else
    {
Imanol-Mikel Barba Sabariego authored
297
298
        NSInteger year = [start year];
        year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
299
        [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
300
301
302
303
304
305
306
    }
    if(end == nil)
    {
        [endDate setString:@""];
    }
    else
    {
Imanol-Mikel Barba Sabariego authored
307
308
        NSInteger year = [end year];
        year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
309
        [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
310
311
312
313
314
    }
    [command appendString:startDate];
    [command appendString:@"-"];
    [command appendString:endDate];
    [self writeMessage:command];
Imanol-Mikel Barba Sabariego authored
315
316
}
Imanol-Mikel Barba Sabariego authored
317
318
319
320
321
322
323
324
325
326
327
328
329
-(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
330
        [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
331
332
333
334
335
336
337
338
339
    }
    if(end == nil)
    {
        [endDate setString:@""];
    }
    else
    {
        NSInteger year = [end year];
        year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
340
        [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
341
342
343
344
345
346
347
    }
    [command appendString:startDate];
    [command appendString:@"-"];
    [command appendString:endDate];
    [self writeMessage:command];
}
Imanol-Mikel Barba Sabariego authored
348
@end