Blame view

DUREX Vendor Control/CommunicationProtocol.m 13.1 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) reportError : (NSString*) error
Imanol-Mikel Barba Sabariego authored
37
{
Imanol-Mikel Barba Sabariego authored
38
Imanol-Mikel Barba Sabariego authored
39
40
}
Imanol-Mikel Barba Sabariego authored
41
-(void) readMessage
Imanol-Mikel Barba Sabariego authored
42
{
Imanol-Mikel Barba Sabariego authored
43
    self.numPackets = -1;
Imanol-Mikel Barba Sabariego authored
44
    [self waitForMessage: 0];
Imanol-Mikel Barba Sabariego authored
45
46
}
Imanol-Mikel Barba Sabariego authored
47
- (void) readNextFragment
Imanol-Mikel Barba Sabariego authored
48
{
Imanol-Mikel Barba Sabariego authored
49
50
    __block NSUInteger numBytes;
    if(self.numPackets)
Imanol-Mikel Barba Sabariego authored
51
    {
Imanol-Mikel Barba Sabariego authored
52
        [[EMConnectionManager sharedManager] readResource:@"numBytes" onSuccess:^(id readValue)
Imanol-Mikel Barba Sabariego authored
53
        {
Imanol-Mikel Barba Sabariego authored
54
55
56
            numBytes = [readValue unsignedCharValue];
            NSLog(@"[CommunicationProtocol.m]: numBytes read: %d",numBytes);
            [[EMConnectionManager sharedManager] readResource:@"data" onSuccess:^(id readValue)
Imanol-Mikel Barba Sabariego authored
57
            {
Imanol-Mikel Barba Sabariego authored
58
59
60
61
62
63
64
65
66
67
68
                NSString *readData = [readValue substringToIndex:numBytes];
                if([readValue length] < numBytes)
                {
                    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");
Imanol-Mikel Barba Sabariego authored
69
                    [self waitForMessage: 0];
Imanol-Mikel Barba Sabariego authored
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
                }onFail:^(NSError *error)
                {
                    NSLog(@"[CommunicationProtocol.m]: On setMessageAvailableDevice to FALSE: %@",error);
                    [self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
                }];
            }onFail:^(NSError *error)
            {
                NSLog(@"[CommunicationProtocol.m]: On readData: %@",error);
                [self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
            }];
        }onFail:^(NSError *error)
        {
            NSLog(@"[CommunicationProtocol.m]: On readNumBytes: %@",error);
            [self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
        }];
    }
    else
    {
Imanol-Mikel Barba Sabariego authored
88
        [[self delegate] processMessage:self didFinishEnteringItem:self.message];
Imanol-Mikel Barba Sabariego authored
89
90
91
    }
}
Imanol-Mikel Barba Sabariego authored
92
- (void) readNumPackets
Imanol-Mikel Barba Sabariego authored
93
{
Imanol-Mikel Barba Sabariego authored
94
    [[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
Imanol-Mikel Barba Sabariego authored
95
    {
Imanol-Mikel Barba Sabariego authored
96
97
98
99
100
101
102
103
        self.numPackets = [readValue unsignedCharValue];
        NSLog(@"[CommunicationProtocol.m]: numPackets read: %d",self.numPackets);
        [self readNextFragment];
    }onFail:^(NSError *error)
    {
        NSLog(@"[CommunicationProtocol.m]: On readNumPackets: %@",error);
        [self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
    }];
Imanol-Mikel Barba Sabariego authored
104
105
}
Imanol-Mikel Barba Sabariego authored
106
- (void) waitForMessage: (uint8_t) retries
Imanol-Mikel Barba Sabariego authored
107
{
Imanol-Mikel Barba Sabariego authored
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
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);
            [self reportError:[NSString stringWithFormat:@"Error occurred while reading answer from device: %@",[error localizedDescription]]];
        }];
    }
Imanol-Mikel Barba Sabariego authored
142
143
}
Imanol-Mikel Barba Sabariego authored
144
-(void) writeMessage: (NSString*) message
Imanol-Mikel Barba Sabariego authored
145
{
Imanol-Mikel Barba Sabariego authored
146
147
148
149
    NSLog(@"[CommunicationProtocol.m]: Sending message: %@",message);
    [self setMessage:[NSMutableString stringWithString:message]];
    [self setRemainingBytes:[message length]];
    [self setCurrentIndex:0];
Imanol-Mikel Barba Sabariego authored
150
151
    [[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
     {
Imanol-Mikel Barba Sabariego authored
152
         NSLog(@"[CommunicationProtocol.m]: numPackets set to %u",([message length]/MAX_STRING_LENGTH) + 1);
Imanol-Mikel Barba Sabariego authored
153
154
         [self sendNextFragment];
     }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
155
     {
Imanol-Mikel Barba Sabariego authored
156
157
158
159
160
161
162
163
164
         NSLog(@"[CommunicationProtocol.m]: On setNumPackets: %@",error);
         [self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
     }];
}

- (void) sendNextFragment
{
    NSLog(@"[CommunicationProtocol.m]: Sending next fragment");
    [[EMConnectionManager sharedManager] writeValue:@"0" toResource:@"messageAvailableMobile" onSuccess:^
Imanol-Mikel Barba Sabariego authored
165
    {
Imanol-Mikel Barba Sabariego authored
166
167
168
        NSLog(@"[CommunicationProtocol.m]: messageAvailableMobile set to FALSE");
        NSUInteger numBytes;
        if(self.remainingBytes)
Imanol-Mikel Barba Sabariego authored
169
        {
Imanol-Mikel Barba Sabariego authored
170
            if(self.remainingBytes > MAX_STRING_LENGTH)
Imanol-Mikel Barba Sabariego authored
171
172
            {
                numBytes = MAX_STRING_LENGTH;
Imanol-Mikel Barba Sabariego authored
173
                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
            [[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)numBytes] toResource:@"numBytes" onSuccess:^
Imanol-Mikel Barba Sabariego authored
181
             {
Imanol-Mikel Barba Sabariego authored
182
                 NSLog(@"[CommunicationProtocol.m]: numBytes set to %d", numBytes);
Imanol-Mikel Barba Sabariego authored
183
184
185
186
187
188
189
190
191
                 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");
Imanol-Mikel Barba Sabariego authored
192
                           [self readACK: 0];
Imanol-Mikel Barba Sabariego authored
193
194
195
196
197
198
199
200
201
202
203
                       }onFail:^(NSError *error)
                       {
                           NSLog(@"[CommunicationProtocol.m]: On setMessageAvailable to TRUE: %@",error);
                           [self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
                       }];
                  }onFail:^(NSError *error)
                  {
                      NSLog(@"[CommunicationProtocol.m]: On setData: %@",error);
                      [self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
                  }];
             }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
204
             {
Imanol-Mikel Barba Sabariego authored
205
206
207
208
209
210
                 NSLog(@"[CommunicationProtocol.m]: On setNumBytes: %@",error);
                 [self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
             }];
        }
        else
        {
Imanol-Mikel Barba Sabariego authored
211
            NSLog(@"[CommunicationProtocol.m]: Finished sending message");
Imanol-Mikel Barba Sabariego authored
212
213
214
215
216
217
218
219
220
221
            [self readMessage];
        }

    }onFail:^(NSError *error)
    {
        NSLog(@"[CommunicationProtocol.m]: On setMessageAvailableMobile to FALSE: %@",error);
        [self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
    }];
}
Imanol-Mikel Barba Sabariego authored
222
- (void) readACK: (uint8_t) retries
Imanol-Mikel Barba Sabariego authored
223
{
Imanol-Mikel Barba Sabariego authored
224
    if(retries == MAX_RETRIES)
Imanol-Mikel Barba Sabariego authored
225
    {
Imanol-Mikel Barba Sabariego authored
226
227
228
229
230
231
232
        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
233
        {
Imanol-Mikel Barba Sabariego authored
234
235
            [self setMessageAvailableMobile:[readValue intValue]];
            if([self messageAvailableMobile])
Imanol-Mikel Barba Sabariego authored
236
            {
Imanol-Mikel Barba Sabariego authored
237
238
239
240
241
                NSLog(@"[CommunicationProtocol.m]: Device not ready. Retrying...");
                [NSThread sleepForTimeInterval:SLEEP_TIME];
                [self readACK:retries + 1];
            }
            else
Imanol-Mikel Barba Sabariego authored
242
            {
Imanol-Mikel Barba Sabariego authored
243
244
245
                [self sendNextFragment];
            }
        }onFail:^(NSError *error)
Imanol-Mikel Barba Sabariego authored
246
        {
Imanol-Mikel Barba Sabariego authored
247
248
249
250
            NSLog(@"[CommunicationProtocol.m]: On readACK: %@",error);
            [self reportError:[NSString stringWithFormat:@"Error occurred while sending command to device: %@",[error localizedDescription]]];
        }];
    }
Imanol-Mikel Barba Sabariego authored
251
252
}
Imanol-Mikel Barba Sabariego authored
253
-(void) establishConnection
Imanol-Mikel Barba Sabariego authored
254
{
Imanol-Mikel Barba Sabariego authored
255
    NSLog(@"[CommunicationProtocol.m]: Establishing connection...");
Imanol-Mikel Barba Sabariego authored
256
257
    [self writeMessage:@"Hello"];
    NSLog(@"[CommunicationProtocol.m]: Hello sent");
Imanol-Mikel Barba Sabariego authored
258
259
}
Imanol-Mikel Barba Sabariego authored
260
-(void) updateTime: (NSDateComponents*) date
Imanol-Mikel Barba Sabariego authored
261
262
263
264
{
    NSMutableString *command = [NSMutableString stringWithFormat: @"A5"];
    NSInteger year = [date year];
    year = year - (year/100)*100;
Imanol-Mikel Barba Sabariego authored
265
266
    [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]]];
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
290
{
    NSString *command = @"A4";
    [self writeMessage:command];
Imanol-Mikel Barba Sabariego authored
291
    /*NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P400015000150001500000001001003005002000001002"];
Imanol-Mikel Barba Sabariego authored
292
    for(int i = 0; i < 4; i++)
Imanol-Mikel Barba Sabariego authored
293
294
    {
        [answer appendString:@"0"];
Imanol-Mikel Barba Sabariego authored
295
        [answer appendString:@"1"];
Imanol-Mikel Barba Sabariego authored
296
    }
Imanol-Mikel Barba Sabariego authored
297
    for(int i = 0; i < 12; i++)
Imanol-Mikel Barba Sabariego authored
298
    {
Imanol-Mikel Barba Sabariego authored
299
300
        [answer appendString:@"0"];
        [answer appendString:@"0"];
Imanol-Mikel Barba Sabariego authored
301
    }
Imanol-Mikel Barba Sabariego authored
302
303

    [answer appendString:@"0"];
Imanol-Mikel Barba Sabariego authored
304
    [answer appendString:@"0"];*/
Imanol-Mikel Barba Sabariego authored
305
306
}
Imanol-Mikel Barba Sabariego authored
307
-(void) readSalesLog : (NSDateComponents*) start : (NSDateComponents*) end
Imanol-Mikel Barba Sabariego authored
308
{
Imanol-Mikel Barba Sabariego authored
309
310
    NSMutableString *startDate = [NSMutableString stringWithString:@""];
    NSMutableString *endDate = [NSMutableString stringWithString:@""];
Imanol-Mikel Barba Sabariego authored
311
312
313
314
315
316
317
    NSMutableString *command = [NSMutableString stringWithString:@"A2"];
    if(start == nil)
    {
        [startDate setString:@""];
    }
    else
    {
Imanol-Mikel Barba Sabariego authored
318
319
320
321
        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]]];
Imanol-Mikel Barba Sabariego authored
322
323
324
325
326
327
328
    }
    if(end == nil)
    {
        [endDate setString:@""];
    }
    else
    {
Imanol-Mikel Barba Sabariego authored
329
330
331
332
        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]]];
Imanol-Mikel Barba Sabariego authored
333
334
335
336
337
    }
    [command appendString:startDate];
    [command appendString:@"-"];
    [command appendString:endDate];
    [self writeMessage:command];
Imanol-Mikel Barba Sabariego authored
338
Imanol-Mikel Barba Sabariego authored
339
    //NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P21408161036000001000000110450000001P21409012216000100000000220900000100P21409032307000000010502330800000000P21409070540000000020000440350000001P2P2"];
Imanol-Mikel Barba Sabariego authored
340
341
}
Imanol-Mikel Barba Sabariego authored
342
@end