|
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
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
|
//
// 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;
}
-(Boolean) waitForMessageAvailable: (Boolean) status
{
uint8_t retries = 0;
while([self messageAvailable] != status)
{
[NSThread sleepForTimeInterval:5];
if([self messageAvailable] != status)
{
if(retries++ == MAX_RETRIES)
{
return FALSE;
}
}
}
return TRUE;
}
-(NSString*) readMessage
{
__block uint8_t numPackets, numBytes;
__block NSMutableString *message;
[message setString:@""];
if([self waitForMessageAvailable:TRUE])
{
[[EMConnectionManager sharedManager] readResource:@"numPackets" onSuccess:^(id readValue)
{
numPackets = (uint8_t) [readValue unsignedCharValue];
}
onFail:^(NSError *error)
{
|
|
56
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
57
58
59
60
61
62
63
64
65
66
67
68
|
numPackets = 0;
}];
if(numPackets)
{
for(int i = 0; i < numPackets; i++)
{
[[EMConnectionManager sharedManager] readResource:@"numBytes" onSuccess:^(id readValue)
{
numBytes = (uint8_t) [readValue unsignedCharValue];
}
onFail:^(NSError *error)
{
|
|
69
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
70
71
72
73
74
75
76
77
78
79
|
numBytes = 0;
}];
if(numBytes)
{
[[EMConnectionManager sharedManager] readResource:@"data" onSuccess:^(id readValue)
{
[message appendString:[readValue stringValue]];
}
onFail:^(NSError *error)
{
|
|
80
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
81
82
83
84
85
86
87
88
89
90
91
|
}];
}
}
}
}
[[EMConnectionManager sharedManager] writeValue:@"FALSE" toResource:@"messageAvailable" onSuccess:^
{
}
onFail:^(NSError *error)
{
|
|
92
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
}
];
return message;
}
-(Boolean) writeMessage: (NSString*) message
{
unsigned long remainingBytes = [message length];
uint8_t numBytes, current_index = 0;
__block Boolean status = FALSE;
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)([message length]/MAX_STRING_LENGTH)+1] toResource:@"numPackets" onSuccess:^
{
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
109
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
status = FALSE;
}
];
if(status != FALSE)
{
while(remainingBytes)
{
if(![self waitForMessageAvailable:FALSE])
{
status = FALSE;
break;
}
if(remainingBytes > MAX_STRING_LENGTH)
{
numBytes = MAX_STRING_LENGTH;
remainingBytes -= MAX_STRING_LENGTH;
}
else
{
numBytes = remainingBytes;
remainingBytes = 0;
}
|
|
132
|
[[EMConnectionManager sharedManager] writeValue:[NSNumber numberWithUnsignedChar:(unsigned char)numBytes] toResource:@"numBytes" onSuccess:^
|
|
133
134
135
136
137
|
{
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
138
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
139
140
141
142
143
144
145
146
147
148
149
150
151
|
status = FALSE;
}
];
if(status != FALSE)
{
NSString *data = [message substringWithRange:NSMakeRange(current_index, numBytes)];
current_index += numBytes;
[[EMConnectionManager sharedManager] writeValue:data toResource:@"data" onSuccess:^
{
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
152
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
153
154
155
156
157
158
159
160
161
162
163
|
status = FALSE;
}
];
if(status != FALSE)
{
[[EMConnectionManager sharedManager] writeValue:@"TRUE" toResource:@"messageAvailable" onSuccess:^
{
status = TRUE;
}
onFail:^(NSError *error)
{
|
|
164
|
NSLog(@"[CommunicationProtocol.m]: %@",error);
|
|
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
|
status = FALSE;
}
];
}
}
}
}
return status;
}
-(Boolean) establishConnection
{
if([self writeMessage:@"Hello"])
{
NSString *answer = [self readMessage];
if([answer isEqualToString:@"Hello"])
{
return TRUE;
}
}
return FALSE;
}
@end
|