Commit dcf63fcf16adbac526f69c2dc8e724930f25db67

Authored by Imanol-Mikel Barba Sabariego
1 parent eaec457e

--no commit message

DUREX Vendor Control/Base.lproj/Localizable.strings
... ... @@ -34,8 +34,10 @@
34 34 "Channel Engine Status" = "Channel Engine Status";
35 35 "Door Sensor" = "Door Sensor";
36 36 "Coil Sensor" = "Coil Sensor";
  37 +"OPEN" = "OPEN";
  38 +"CLOSED" = "CLOSED";
37 39 "Money Collected" = "Money Collected";
38   -"Money Given" = "Money Given";
  40 +"Money Returned" = "Money Returned";
39 41 "Products Sold" = "Products Sold";
40 42 "Product 1" = "Product 1";
41 43 "Product 2" = "Product 2";
... ... @@ -72,7 +74,7 @@
72 74 "50c Coins" = "50c Coins";
73 75 "Channel" = "Channel";
74 76 "Product Code" = "Product Code";
75   -"Nominal Price" = "Nominal Price";
  77 +"Normal Price" = "Normal Price";
76 78 "Discounted Price" = "Discounted Price";
77 79 "1€ Change" = "1€ Change";
78 80 "50c Change" = "50c Change";
... ...
DUREX Vendor Control/CommunicationProtocol.h
... ... @@ -13,15 +13,14 @@
13 13 #define MAX_RETRIES ((int)3)
14 14 #define MAX_PRODUCT_NAME_LENGTH ((int)64)
15 15 #define MAX_CHANNELS ((int)16)
16   -#define MONEY_NUM_UNITS ((int)5)
  16 +#define MONEY_IN_NUM_UNITS ((int)5)
  17 +#define MONEY_OUT_NUM_UNITS ((int)3)
  18 +#define CHANGE_NUM_UNITS ((int)2)
17 19 #define MAX_PRODUCTS ((int)16)
18 20  
19 21  
20 22 @interface CommunicationProtocol : NSObject
21 23  
22   -@property Boolean messageAvailableMobile;
23   -@property Boolean messageAvailableDevice;
24   -
25 24 -(Boolean) waitForMessageAvailableMobile: (Boolean) status;
26 25 -(Boolean) waitForMessageAvailableDevice: (Boolean) status;
27 26 -(Boolean) writeMessage: (NSString*) message;
... ... @@ -31,6 +30,7 @@
31 30 -(Boolean) updatePrice: (uint8_t) channel : (uint8_t) product : (uint8_t) eur : (uint8_t) cents;
32 31 -(Boolean) updateProductName: (uint8_t) channel : (uint8_t) product : (NSString*) name;
33 32 -(NSString*) readSensorData;
  33 +-(NSString*) readSalesLog: (NSDate*) start : (NSDate*) end;
34 34 +(id) sharedProtocol;
35 35  
36 36 @end
... ...
DUREX Vendor Control/CommunicationProtocol.m
... ... @@ -10,6 +10,9 @@
10 10  
11 11 @interface CommunicationProtocol ()
12 12  
  13 +@property Boolean messageAvailableMobile;
  14 +@property Boolean messageAvailableDevice;
  15 +
13 16 @end
14 17  
15 18 @implementation CommunicationProtocol
... ... @@ -20,6 +23,8 @@
20 23 static dispatch_once_t onceToken;
21 24 dispatch_once(&onceToken, ^{
22 25 shared = [[self alloc] init];
  26 + [shared setMessageAvailableDevice:FALSE];
  27 + [shared setMessageAvailableMobile:FALSE];
23 28 });
24 29 return shared;
25 30 }
... ... @@ -358,37 +363,61 @@
358 363 {
359 364 NSString *command = @"A4";
360 365 [self writeMessage:command];
361   - //NSString *answer = [self readMessage];
  366 + NSString *answer = [self readMessage];
362 367  
363   - char command_str[65];
364   - command_str[0] = 'P';
365   - command_str[1] = '4';
366   - command_str[2] = 255;
367   - command_str[3] = 0;
368   - command_str[4] = 255;
369   - command_str[5] = 0;
370   - command_str[6] = 255;
371   - command_str[7] = 0;
372   - command_str[8] = '1';
373   - command_str[9] = '0';
374   - for(int i = 10; i < 10; i+=3)
  368 + /*NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P400255002550025510"];
  369 + for(int i = 0; i < 15; i++)
  370 + {
  371 + [answer appendString:@"0"];
  372 + }
  373 + for(int i = 0; i < 9; i++)
  374 + {
  375 + [answer appendString:@"4"];
  376 + }
  377 + for(int i = 0; i < 32; i++)
375 378 {
376   - command_str[i] = '0';
377   - command_str[i+1] = '0';
378   - command_str[i+2] = '0';
  379 + [answer appendString:@"2"];
379 380 }
380   - for(int i = 40; i < 16; i+=2)
  381 + [answer appendString:@"1"];
  382 + [answer appendString:@"1"];*/
  383 +
  384 + if([[answer substringToIndex:2]isEqualToString:@"P4"])
381 385 {
382   - command_str[i] = '0';
383   - command_str[i+1] = '0';
  386 + return answer;
384 387 }
385   - command_str[63] = '1';
386   - command_str[64] = '1';
  388 + return nil;
  389 +}
  390 +
  391 +-(NSString*) readSalesLog : (NSDate*) start : (NSDate*) end
  392 +{
  393 + NSMutableString *startDate = [[NSMutableString alloc] init];
  394 + NSMutableString *endDate = [[NSMutableString alloc] init];
  395 + NSMutableString *command = [NSMutableString stringWithString:@"A2"];
  396 + if(start == nil)
  397 + {
  398 + [startDate setString:@""];
  399 + }
  400 + else
  401 + {
  402 +
  403 + }
  404 + if(end == nil)
  405 + {
  406 + [endDate setString:@""];
  407 + }
  408 + else
  409 + {
  410 +
  411 + }
  412 + [command appendString:startDate];
  413 + [command appendString:@"-"];
  414 + [command appendString:endDate];
  415 + [self writeMessage:command];
  416 + //NSString *answer = [self readMessage];
387 417  
388   - NSMutableString *answer = [[NSMutableString alloc]init];
389   - [answer appendString:[NSString stringWithUTF8String:command_str]];
  418 + NSMutableString *answer = [[NSMutableString alloc]initWithString:@"P21405141651102416090662045001500512P21406141651102416090662045001500512P2P2"];
390 419  
391   - if([[answer substringToIndex:2] isEqualToString:@"P4"])
  420 + if([[answer substringToIndex:2]isEqualToString:@"P2"])
392 421 {
393 422 return answer;
394 423 }
... ...
DUREX Vendor Control/DUREX Vendor Control.xcodeproj/project.pbxproj
... ... @@ -36,6 +36,10 @@
36 36 F98356DB192EAFD400EA6821 /* CommunicationProtocol.m in Sources */ = {isa = PBXBuildFile; fileRef = F98356DA192EAFD400EA6821 /* CommunicationProtocol.m */; };
37 37 F98356E1192EC84700EA6821 /* MenuTableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = F98356E0192EC84700EA6821 /* MenuTableViewController.m */; };
38 38 F98446F019B9EAE9005C4992 /* Sensors.m in Sources */ = {isa = PBXBuildFile; fileRef = F98446EF19B9EAE9005C4992 /* Sensors.m */; };
  39 + F989B5FB19BBC80300657DD9 /* carat-open.png in Resources */ = {isa = PBXBuildFile; fileRef = F989B5F919BBC80300657DD9 /* carat-open.png */; };
  40 + F989B5FC19BBC80300657DD9 /* carat.png in Resources */ = {isa = PBXBuildFile; fileRef = F989B5FA19BBC80300657DD9 /* carat.png */; };
  41 + F989B5FF19BCD7A100657DD9 /* Sale.m in Sources */ = {isa = PBXBuildFile; fileRef = F989B5FE19BCD7A100657DD9 /* Sale.m */; };
  42 + F989B60219BCE28C00657DD9 /* SalesLog.m in Sources */ = {isa = PBXBuildFile; fileRef = F989B60119BCE28C00657DD9 /* SalesLog.m */; };
39 43 F9A8EF7C192FE201009E7532 /* Stack.m in Sources */ = {isa = PBXBuildFile; fileRef = F9A8EF7B192FE201009E7532 /* Stack.m */; };
40 44 F9C77F50192CDE30002DBE8A /* system.json in Resources */ = {isa = PBXBuildFile; fileRef = F9C77F4F192CDE30002DBE8A /* system.json */; };
41 45 F9E4D8FD19B8FD32009A7359 /* EMConnectingView_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = F9E4D8FF19B8FD32009A7359 /* EMConnectingView_iPad.xib */; };
... ... @@ -118,6 +122,12 @@
118 122 F98356E0192EC84700EA6821 /* MenuTableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MenuTableViewController.m; sourceTree = SOURCE_ROOT; };
119 123 F98446EE19B9EAE9005C4992 /* Sensors.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sensors.h; sourceTree = SOURCE_ROOT; };
120 124 F98446EF19B9EAE9005C4992 /* Sensors.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Sensors.m; sourceTree = SOURCE_ROOT; };
  125 + F989B5F919BBC80300657DD9 /* carat-open.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "carat-open.png"; sourceTree = SOURCE_ROOT; };
  126 + F989B5FA19BBC80300657DD9 /* carat.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = carat.png; sourceTree = SOURCE_ROOT; };
  127 + F989B5FD19BCD7A100657DD9 /* Sale.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Sale.h; sourceTree = SOURCE_ROOT; };
  128 + F989B5FE19BCD7A100657DD9 /* Sale.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Sale.m; sourceTree = SOURCE_ROOT; };
  129 + F989B60019BCE28C00657DD9 /* SalesLog.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SalesLog.h; sourceTree = SOURCE_ROOT; };
  130 + F989B60119BCE28C00657DD9 /* SalesLog.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SalesLog.m; sourceTree = SOURCE_ROOT; };
121 131 F9A8EF7A192FE201009E7532 /* Stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Stack.h; sourceTree = SOURCE_ROOT; };
122 132 F9A8EF7B192FE201009E7532 /* Stack.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Stack.m; sourceTree = SOURCE_ROOT; };
123 133 F9C77F4F192CDE30002DBE8A /* system.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = system.json; sourceTree = SOURCE_ROOT; };
... ... @@ -190,6 +200,8 @@
190 200 F92F568E19B763FD00A1EACA /* NameChangerViewController.m */,
191 201 34AAB880189804FF0019860D /* main.m */,
192 202 F98446EF19B9EAE9005C4992 /* Sensors.m */,
  203 + F989B5FE19BCD7A100657DD9 /* Sale.m */,
  204 + F989B60119BCE28C00657DD9 /* SalesLog.m */,
193 205 );
194 206 name = "DUREX Vendor Control";
195 207 path = TestAppExample;
... ... @@ -283,6 +295,8 @@
283 295 F92F567619B75F5E00A1EACA /* PriceChangerViewController.h */,
284 296 F92F568D19B763FD00A1EACA /* NameChangerViewController.h */,
285 297 F98446EE19B9EAE9005C4992 /* Sensors.h */,
  298 + F989B5FD19BCD7A100657DD9 /* Sale.h */,
  299 + F989B60019BCE28C00657DD9 /* SalesLog.h */,
286 300 );
287 301 name = Headers;
288 302 sourceTree = "<group>";
... ... @@ -291,6 +305,8 @@
291 305 isa = PBXGroup;
292 306 children = (
293 307 34AAB88C189805300019860D /* Images.xcassets */,
  308 + F989B5F919BBC80300657DD9 /* carat-open.png */,
  309 + F989B5FA19BBC80300657DD9 /* carat.png */,
294 310 F97B90C919B859F500DDA9EF /* icon_checkmark.png */,
295 311 F97B90CA19B859F500DDA9EF /* icon_delete.png */,
296 312 F961D80E199A5F2D00E9282C /* back_arrow.png */,
... ... @@ -360,6 +376,7 @@
360 376 F9015D9719B7305E006C7882 /* DatePickerViewController_iPad.xib in Resources */,
361 377 F961D819199A711300E9282C /* EMConnectingView.xib in Resources */,
362 378 F9C77F50192CDE30002DBE8A /* system.json in Resources */,
  379 + F989B5FC19BBC80300657DD9 /* carat.png in Resources */,
363 380 F92F569B19B76A5D00A1EACA /* NameChangerViewController_iPad.xib in Resources */,
364 381 F92F567D19B7609C00A1EACA /* PriceChangerViewController.xib in Resources */,
365 382 F92F569219B7665F00A1EACA /* NameChangerViewController.xib in Resources */,
... ... @@ -367,6 +384,7 @@
367 384 F961D816199A5FA000E9282C /* Localizable.strings in Resources */,
368 385 F97B90CB19B859F500DDA9EF /* icon_checkmark.png in Resources */,
369 386 34AAB88D189805300019860D /* Images.xcassets in Resources */,
  387 + F989B5FB19BBC80300657DD9 /* carat-open.png in Resources */,
370 388 F92F568419B760A800A1EACA /* PriceChangerViewController_iPad.xib in Resources */,
371 389 F961D804199A5F1000E9282C /* MainStoryboard.storyboard in Resources */,
372 390 );
... ... @@ -381,9 +399,11 @@
381 399 files = (
382 400 F92F569019B763FD00A1EACA /* NameChangerViewController.m in Sources */,
383 401 F933F80419B6819400521B90 /* DatePickerViewController.m in Sources */,
  402 + F989B5FF19BCD7A100657DD9 /* Sale.m in Sources */,
384 403 F98356D6192E835F00EA6821 /* InitialViewController.m in Sources */,
385 404 F9A8EF7C192FE201009E7532 /* Stack.m in Sources */,
386 405 34AAB885189804FF0019860D /* EMDevicePickerViewController.m in Sources */,
  406 + F989B60219BCE28C00657DD9 /* SalesLog.m in Sources */,
387 407 F92F567919B75F5E00A1EACA /* PriceChangerViewController.m in Sources */,
388 408 34AAB883189804FF0019860D /* DUREXAppDelegate.m in Sources */,
389 409 F98356DB192EAFD400EA6821 /* CommunicationProtocol.m in Sources */,
... ...
DUREX Vendor Control/DUREX Vendor Control.xcodeproj/project.xcworkspace/xcuserdata/imanol.xcuserdatad/UserInterfaceState.xcuserstate
No preview for this file type
DUREX Vendor Control/DUREX Vendor Control.xcodeproj/xcuserdata/imanol.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
... ... @@ -2,86 +2,4 @@
2 2 <Bucket
3 3 type = "1"
4 4 version = "2.0">
5   - <Breakpoints>
6   - <BreakpointProxy
7   - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
8   - <BreakpointContent
9   - shouldBeEnabled = "No"
10   - ignoreCount = "0"
11   - continueAfterRunningActions = "No"
12   - filePath = "CommunicationProtocol.m"
13   - timestampString = "431435824.615796"
14   - startingColumnNumber = "9223372036854775807"
15   - endingColumnNumber = "9223372036854775807"
16   - startingLineNumber = "109"
17   - endingLineNumber = "109"
18   - landmarkName = "-readMessage"
19   - landmarkType = "5">
20   - </BreakpointContent>
21   - </BreakpointProxy>
22   - <BreakpointProxy
23   - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
24   - <BreakpointContent
25   - shouldBeEnabled = "No"
26   - ignoreCount = "0"
27   - continueAfterRunningActions = "No"
28   - filePath = "CommunicationProtocol.m"
29   - timestampString = "431391382.511911"
30   - startingColumnNumber = "9223372036854775807"
31   - endingColumnNumber = "9223372036854775807"
32   - startingLineNumber = "100"
33   - endingLineNumber = "100"
34   - landmarkName = "-waitForMessageAvailableDevice:"
35   - landmarkType = "5">
36   - </BreakpointContent>
37   - </BreakpointProxy>
38   - <BreakpointProxy
39   - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
40   - <BreakpointContent
41   - shouldBeEnabled = "No"
42   - ignoreCount = "0"
43   - continueAfterRunningActions = "No"
44   - filePath = "CommunicationProtocol.m"
45   - timestampString = "431391382.511911"
46   - startingColumnNumber = "9223372036854775807"
47   - endingColumnNumber = "9223372036854775807"
48   - startingLineNumber = "104"
49   - endingLineNumber = "104"
50   - landmarkName = "-waitForMessageAvailableDevice:"
51   - landmarkType = "5">
52   - </BreakpointContent>
53   - </BreakpointProxy>
54   - <BreakpointProxy
55   - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
56   - <BreakpointContent
57   - shouldBeEnabled = "No"
58   - ignoreCount = "0"
59   - continueAfterRunningActions = "No"
60   - filePath = "DatePickerViewController.m"
61   - timestampString = "431511161.110287"
62   - startingColumnNumber = "9223372036854775807"
63   - endingColumnNumber = "9223372036854775807"
64   - startingLineNumber = "71"
65   - endingLineNumber = "71"
66   - landmarkName = "-closePopup:"
67   - landmarkType = "5">
68   - </BreakpointContent>
69   - </BreakpointProxy>
70   - <BreakpointProxy
71   - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
72   - <BreakpointContent
73   - shouldBeEnabled = "No"
74   - ignoreCount = "0"
75   - continueAfterRunningActions = "No"
76   - filePath = "FirstAppExample/EMDevicePickerViewController.m"
77   - timestampString = "431555215.246709"
78   - startingColumnNumber = "9223372036854775807"
79   - endingColumnNumber = "9223372036854775807"
80   - startingLineNumber = "107"
81   - endingLineNumber = "107"
82   - landmarkName = "-tableView:didSelectRowAtIndexPath:"
83   - landmarkType = "5">
84   - </BreakpointContent>
85   - </BreakpointProxy>
86   - </Breakpoints>
87 5 </Bucket>
... ...
DUREX Vendor Control/FirstAppExample/Base.lproj/MainStoryboard.storyboard
... ... @@ -7,7 +7,6 @@
7 7 <!--Device Picker View Controller - Select device-->
8 8 <scene sceneID="ZOj-VY-rze">
9 9 <objects>
10   - <placeholder placeholderIdentifier="IBFirstResponder" id="MD6-l6-Rrg" userLabel="First Responder" sceneMemberID="firstResponder"/>
11 10 <tableViewController id="0dd-lZ-pDC" customClass="EMDevicePickerViewController" sceneMemberID="viewController">
12 11 <tableView key="view" opaque="NO" clipsSubviews="YES" clearsContextBeforeDrawing="NO" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" id="jWc-kM-kFO">
13 12 <rect key="frame" x="0.0" y="0.0" width="320" height="568"/>
... ... @@ -49,6 +48,7 @@
49 48 <segue destination="iNx-eR-wSX" kind="push" identifier="ConnectionSegue" id="3oK-BK-2Qs"/>
50 49 </connections>
51 50 </tableViewController>
  51 + <placeholder placeholderIdentifier="IBFirstResponder" id="MD6-l6-Rrg" userLabel="First Responder" sceneMemberID="firstResponder"/>
52 52 </objects>
53 53 <point key="canvasLocation" x="342" y="-9"/>
54 54 </scene>
... ...
DUREX Vendor Control/FirstAppExample/main.m
1   -//
  1 + //
2 2 // main.m
3 3 // TestAppExample
4 4 //
... ...
DUREX Vendor Control/MenuTableViewController.h
... ... @@ -14,22 +14,30 @@
14 14 #import "PriceChangerViewController.h"
15 15 #import "NameChangerViewController.h"
16 16 #import "Sensors.h"
  17 +#import "SalesLog.h"
17 18  
18 19 #define num(x) [NSNumber numberWithUnsignedInt:x]
19 20  
20   -#define MENU_ELEMENTS @"Maintenance",@"Basic Configuration",@"Sending a Report"
  21 +#define CELL_CARAT_TAG 100
  22 +
  23 +#define MENU_ELEMENTS @"[1000]Maintenance",@"[1001]Basic Configuration",@"[1002]Sending a Report"
21 24 #define MENU_CELLS_PER_SECTION num(3)
22   -#define MENU_HEADERS nil
  25 +#define MENU_HEADERS nil
23 26  
24   -#define MAINTENANCE_ELEMENTS @"Channels Present",@"Product Present in Channel",@"Channel Engine Status",@"Door Sensor",@"Coil sensor",@"Money Collected",@"10€ Notes",@"5€ Notes",@"2€ Coins",@"1€ Coins",@"50c Coins",@"Money given",@"10€ Notes",@"5€ Notes",@"2€ Coins",@"1€ Coins",@"50c Coins",@"Products Sold",@"Change Available",@"1€ Coins",@"50c Coins",@"Sales log",@"Incident report",@"Send report"
25   -#define MAINTENANCE_CELLS_PER_SECTION num(21),num(3)
  27 +#define MAINTENANCE_ELEMENTS @">[2000]Channels Present",@">[2001]Product Present in Channel",@">[2002]Channel Engine Status",@"[2003]Door Sensor",@"[2004]Coil Sensor",@">[2005]Money Collected",@">[2006]Money Returned",@">[2007]Products Sold",@">[2008]Change Available",@"[2009]Sales log",@"[2010]Incident report",@"[2011]Send report"
  28 +#define MAINTENANCE_CHANNELS @"*Channel 1",@"*Channel 2",@"*Channel 3",@"*Channel 4",@"*Channel 5",@"*Channel 6",@"*Channel 7",@"*Channel 8",@"*Channel 9",@"*Channel 10",@"*Channel 11",@"*Channel 12",@"*Channel 13",@"*Channel 14",@"*Channel 15",@"*Channel 16"
  29 +#define MAINTENANCE_MONEY_IN @"*10€ Notes",@"*5€ Notes",@"*2€ Coins",@"*1€ Coins",@"*50c Coins"
  30 +#define MAINTENANCE_MONEY_OUT @"*2€ Coins",@"*1€ Coins",@"*50c Coins"
  31 +#define MAINTENANCE_CHANGE @"*1€ Coins",@"*50c Coins"
  32 +#define MAINTENANCE_PRODUCTS @"*Product 1",@"*Product 2",@"*Product 3",@"*Product 4",@"*Product 5",@"*Product 6",@"*Product 7",@"*Product 8",@"*Product 9",@"*Product 10",@"*Product 11",@"*Product 12",@"*Product 13",@"*Product 14",@"*Product 15",@"*Product 16"
  33 +#define MAINTENANCE_CELLS_PER_SECTION num(9),num(3)
26 34 #define MAINTENANCE_HEADERS NSLocalizedString(@"Sensors", nil),NSLocalizedString(@"Commands", nil)
27 35  
28   -#define SALES_ELEMENTS @"20€ Notes",@"10€ Notes",@"5€ Notes",@"2€ Coins",@"1€ Coins",@"50c Coins",@"Channel",@"Product Code",@"Nominal Price",@"Discounted Price",@"1€ Change",@"50c Change",@"20€ Notes",@"10€ Notes",@"5€ Notes",@"2€ Coins",@"1€ Coins",@"50c Coins",@"Channel",@"Product Code",@"Nominal Price",@"Discounted Price",@"1€ Change",@"50c Change",@"20€ Notes",@"10€ Notes",@"5€ Notes",@"2€ Coins",@"1€ Coins",@"50c Coins",@"Channel",@"Product Code",@"Nominal Price",@"Discounted Price",@"1€ Change",@"50c Change"
29   -#define SALES_CELLS_PER_SECTION num(12),num(12),num(12)
30   -#define SALES_HEADERS @"14/06/2014",@"25/06/2014",@"05/07/2014"
  36 +#define SALES_ELEMENTS @"10€ Notes",@"5€ Notes",@"2€ Coins",@"1€ Coins",@"50c Coins",@"Channel",@"Product Code",@"Normal Price",@"Discounted Price",@"1€ Change",@"50c Change"
  37 +#define SALES_CELLS_PER_SECTION num(11)
  38 +#define SALES_HEADERS @"14/06/2014"
31 39  
32   -#define CONFIGURATION_ELEMENTS @"Update Date & Time",@"Update product price",@"Update product name"
  40 +#define CONFIGURATION_ELEMENTS @"[3000]Update Date & Time",@"[3001]Update product price",@"[3002]Update product name"
33 41 #define CONFIGURATION_CELLS_PER_SECTION num(3)
34 42 #define CONFIGURATION_HEADERS nil
35 43  
... ... @@ -50,6 +58,7 @@ enum {
50 58 @property (strong,nonatomic) PriceChangerViewController *priceChangerViewController;
51 59 @property (strong,nonatomic) NameChangerViewController *nameChangerViewController;
52 60 @property (strong,nonatomic) Sensors *sensorStatus;
  61 +@property (strong,nonatomic) SalesLog *salesLog;
53 62  
54 63 - (void) navBack;
55 64  
... ...
DUREX Vendor Control/MenuTableViewController.m
... ... @@ -13,30 +13,30 @@
13 13 IBOutlet UIActivityIndicatorView *_activityIndicator;
14 14 NSTimer *_writeTimer;
15 15 }
16   -@property (nonatomic,strong) const NSArray *menuElements;
17   -@property (nonatomic,strong) const NSArray *menuStructure;
18   -@property (nonatomic,strong) const NSArray *menuHeaders;
  16 +@property (nonatomic,strong) const NSMutableArray *menuElements;
  17 +@property (nonatomic,strong) const NSMutableArray *menuStructure;
  18 +@property (nonatomic,strong) const NSMutableArray *menuHeaders;
19 19  
20   -@property (nonatomic,strong) const NSArray *maintenanceElements;
21   -@property (nonatomic,strong) const NSArray *maintenanceStructure;
22   -@property (nonatomic,strong) const NSArray *maintenanceHeaders;
  20 +@property (nonatomic,strong) const NSMutableArray *maintenanceElements;
  21 +@property (nonatomic,strong) const NSMutableArray *maintenanceStructure;
  22 +@property (nonatomic,strong) const NSMutableArray *maintenanceHeaders;
23 23  
24   -@property (nonatomic,strong) const NSArray *salesElements;
25   -@property (nonatomic,strong) const NSArray *salesStructure;
26   -@property (nonatomic,strong) const NSArray *salesHeaders;
  24 +@property (nonatomic,strong) const NSMutableArray *salesElements;
  25 +@property (nonatomic,strong) const NSMutableArray *salesStructure;
  26 +@property (nonatomic,strong) const NSMutableArray *salesHeaders;
27 27  
28   -@property (nonatomic,strong) const NSArray *configElements;
29   -@property (nonatomic,strong) const NSArray *configStructure;
30   -@property (nonatomic,strong) const NSArray *configHeaders;
  28 +@property (nonatomic,strong) const NSMutableArray *configElements;
  29 +@property (nonatomic,strong) const NSMutableArray *configStructure;
  30 +@property (nonatomic,strong) const NSMutableArray *configHeaders;
31 31  
32 32 @property (nonatomic,strong) const NSArray *cellIdentifiers;
33 33  
34 34 @property (nonatomic,strong) CommunicationProtocol* protocol;
35 35 @property uint8_t currentNavLevel;
36 36 @property NSString *currentCellIdentifier;
37   -@property const NSArray *currentElements;
38   -@property const NSArray *currentStructure;
39   -@property const NSArray *currentHeaders;
  37 +@property const NSMutableArray *currentElements;
  38 +@property const NSMutableArray *currentStructure;
  39 +@property const NSMutableArray *currentHeaders;
40 40  
41 41 @end
42 42  
... ... @@ -54,22 +54,22 @@
54 54  
55 55 - (void) initializeMenuEntries
56 56 {
57   - [self setMenuElements:[[NSArray alloc] initWithObjects:MENU_ELEMENTS, nil]];
58   - [self setMenuStructure:[[NSArray alloc] initWithObjects:MENU_CELLS_PER_SECTION, nil]];
  57 + [self setMenuElements:[[NSMutableArray alloc] initWithObjects:MENU_ELEMENTS, nil]];
  58 + [self setMenuStructure:[[NSMutableArray alloc] initWithObjects:MENU_CELLS_PER_SECTION, nil]];
59 59 if([[self menuStructure] count] > 1)
60 60 {
61   - [self setMenuHeaders:[[NSArray alloc] initWithObjects:MENU_HEADERS, nil]];
  61 + [self setMenuHeaders:[[NSMutableArray alloc] initWithObjects:MENU_HEADERS, nil]];
62 62 }
63 63 else
64 64 {
65 65 [self setMenuHeaders:nil];
66 66 }
67 67  
68   - [self setConfigElements:[[NSArray alloc] initWithObjects:CONFIGURATION_ELEMENTS, nil]];
69   - [self setConfigStructure:[[NSArray alloc] initWithObjects:CONFIGURATION_CELLS_PER_SECTION, nil]];
  68 + [self setConfigElements:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_ELEMENTS, nil]];
  69 + [self setConfigStructure:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_CELLS_PER_SECTION, nil]];
70 70 if([[self configStructure] count] > 1)
71 71 {
72   - [self setConfigHeaders:[[NSArray alloc] initWithObjects:CONFIGURATION_HEADERS, nil]];
  72 + [self setConfigHeaders:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_HEADERS, nil]];
73 73 }
74 74 else
75 75 {
... ... @@ -79,34 +79,49 @@
79 79 [self setCellIdentifiers:[[NSArray alloc] initWithObjects:CELL_IDENTIFIERS, nil]];
80 80 }
81 81  
82   -- (void) generateMaintenanceLevel
  82 +- (Boolean) generateMaintenanceLevel
83 83 {
84   - [[self sensorStatus] setResponse:[_protocol readSensorData]];
85   - //DO SUM SHIET
86   - [self setMaintenanceElements:[[NSArray alloc] initWithObjects:MAINTENANCE_ELEMENTS, nil]];
87   - [self setMaintenanceStructure:[[NSArray alloc] initWithObjects:MAINTENANCE_CELLS_PER_SECTION, nil]];
  84 + NSString *sensorData = [_protocol readSensorData];
  85 + if(sensorData == nil)
  86 + {
  87 + NSLog(@"[MenuTableViewController.m]: Error reading sensor data");
  88 + return FALSE;
  89 + }
  90 + [[self sensorStatus] setResponseValue:sensorData];
  91 + [self setMaintenanceElements:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_ELEMENTS, nil]];
  92 + [self setMaintenanceStructure:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_CELLS_PER_SECTION, nil]];
88 93 if([[self maintenanceStructure] count] > 1)
89 94 {
90   - [self setMaintenanceHeaders:[[NSArray alloc] initWithObjects:MAINTENANCE_HEADERS, nil]];
  95 + [self setMaintenanceHeaders:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_HEADERS, nil]];
91 96 }
92 97 else
93 98 {
94 99 [self setMaintenanceHeaders:nil];
95 100 }
  101 + return TRUE;
96 102 }
97 103  
98   -- (void) generateSalesNavLevel
  104 +- (Boolean) generateSalesNavLevel
99 105 {
100   - [self setSalesElements:[[NSArray alloc] initWithObjects:SALES_ELEMENTS, nil]];
101   - [self setSalesStructure:[[NSArray alloc] initWithObjects:SALES_CELLS_PER_SECTION, nil]];
  106 + //LAUNCH DATE RANGE SELECTOR
  107 + NSString *salesData = [_protocol readSalesLog: nil : nil];
  108 + if(salesData == nil)
  109 + {
  110 + NSLog(@"[MenuTableViewController.m]: Error reading sales log");
  111 + return FALSE;
  112 + }
  113 + [[self salesLog] setResponseValue:salesData];
  114 + [self setSalesElements:[[NSMutableArray alloc] initWithObjects:SALES_ELEMENTS, nil]];
  115 + [self setSalesStructure:[[NSMutableArray alloc] initWithObjects:SALES_CELLS_PER_SECTION, nil]];
102 116 if([[self salesStructure] count] > 1)
103 117 {
104   - [self setSalesHeaders:[[NSArray alloc] initWithObjects:SALES_HEADERS, nil]];
  118 + [self setSalesHeaders:[[NSMutableArray alloc] initWithObjects:SALES_HEADERS, nil]];
105 119 }
106 120 else
107 121 {
108 122 [self setSalesHeaders:nil];
109 123 }
  124 + return TRUE;
110 125 }
111 126  
112 127 - (void) changeNavLevel: (uint8_t) level : (BOOL) push
... ... @@ -147,10 +162,15 @@
147 162 [self setCurrentHeaders:[self configHeaders]];
148 163 }
149 164 //AND SO ON...
  165 + [self reloadTable:UITableViewRowAnimationAutomatic];
  166 +}
  167 +
  168 +- (void) reloadTable: (UITableViewRowAnimation) animation
  169 +{
150 170 [[self tableView] reloadData];
151 171 NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:[self tableView]]);
152 172 NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
153   - [[self tableView] reloadSections:sections withRowAnimation:UITableViewRowAnimationAutomatic];
  173 + [[self tableView] reloadSections:sections withRowAnimation:animation];
154 174 }
155 175  
156 176 - (void) navBack
... ... @@ -217,12 +237,6 @@
217 237  
218 238 //Initialize sensor status
219 239 [self setSensorStatus:[[Sensors alloc]init]];
220   -
221   - // Uncomment the following line to preserve selection between presentations.
222   - // self.clearsSelectionOnViewWillAppear = NO;
223   -
224   - // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
225   - // self.navigationItem.rightBarButtonItem = self.editButtonItem;
226 240 }
227 241  
228 242 -(void)viewDidAppear:(BOOL)animated
... ... @@ -230,8 +244,6 @@
230 244 [super viewDidAppear:animated];
231 245  
232 246 //DUREX protocol
233   - [_protocol setMessageAvailableMobile:false];
234   - [_protocol setMessageAvailableDevice:false];
235 247 if(![_protocol establishConnection])
236 248 {
237 249 UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Communication error" message:@"Error while trying to connect to the device" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
... ... @@ -243,7 +255,7 @@
243 255  
244 256 -(void)didReceiveNotification:(NSNotification*) notification
245 257 {
246   -
  258 +
247 259 }
248 260  
249 261 -(void)dealloc
... ... @@ -274,94 +286,267 @@
274 286  
275 287 #pragma mark - Table view delegate
276 288  
277   -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  289 +- (void) addTags : (NSMutableArray*) rows : (NSInteger) tag
278 290 {
279   - NSLog(@"Section: %ld Row: %ld",(long)[indexPath section],(long)[indexPath row]);
280   - [tableView deselectRowAtIndexPath:indexPath animated:YES];
281   - NSString *cellName = [[[[self tableView] cellForRowAtIndexPath:indexPath]textLabel]text];
282   - if([cellName isEqualToString:NSLocalizedString(@"Maintenance", nil)] && [self currentNavLevel] == MENU)
  291 + for(int i = 0; i < [rows count]; i++)
283 292 {
284   - NSLog(@"[MenuTableViewController.m]: Changing to navLevel: MAINTENANCE");
285   - [self generateMaintenanceLevel];
286   - [self changeNavLevel:MAINTENANCE:TRUE];
  293 + NSMutableString *name = [NSMutableString stringWithString:[rows objectAtIndex:i]];
  294 + [name insertString:[NSString stringWithFormat:@"[%d]",tag] atIndex:1];
  295 + [rows replaceObjectAtIndex:i withObject:name];
287 296 }
288   - else if([cellName isEqualToString:NSLocalizedString(@"Sales log", nil)] && [self currentNavLevel] == MAINTENANCE)
  297 +}
  298 +
  299 +- (void) toggleDropList : (NSIndexPath*) index
  300 +{
  301 + Boolean folded = FALSE;
  302 + NSString *elementName = [[self currentElements] objectAtIndex:index.row];
  303 + NSMutableString *newElementName = [[NSMutableString alloc] init];
  304 + if([elementName characterAtIndex:0] == '>')
289 305 {
290   - NSLog(@"[MenuTableViewController.m]: Changing to navLevel: SALES");
291   - [self generateSalesNavLevel];
292   - [self changeNavLevel:SALES:TRUE];
  306 + [newElementName setString:@"v"];
  307 + [newElementName appendString:[elementName substringFromIndex:1]];
  308 + folded = TRUE;
293 309 }
294   - else if([cellName isEqualToString:NSLocalizedString(@"Basic Configuration", nil)] && [self currentNavLevel] == MENU)
  310 + else
295 311 {
296   - NSLog(@"[MenuTableViewController.m]: Changing to navLevel: BASIC_CONFIGURATION");
297   - [self changeNavLevel:BASIC_CONFIGURATION:TRUE];
  312 + [newElementName setString:@">"];
  313 + [newElementName appendString:[elementName substringFromIndex:1]];
298 314 }
299   - //Update Date & Time command
300   - else if([cellName isEqualToString:NSLocalizedString(@"Update Date & Time", nil)] && [self currentNavLevel] == BASIC_CONFIGURATION)
  315 + [[self currentElements] replaceObjectAtIndex:index.row withObject:newElementName];
  316 + NSMutableString *cellName = [NSMutableString stringWithString:[elementName substringFromIndex:1]];
  317 + NSInteger lastPos = [cellName rangeOfString:@"]"].location;
  318 + NSInteger cellTag = [[cellName substringWithRange:NSMakeRange(1,lastPos)] intValue];
  319 + [cellName setString:[cellName substringFromIndex:lastPos+1]];
  320 +
  321 + //Cells in MENU
  322 + if([self currentNavLevel] == MAINTENANCE)
301 323 {
302   - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  324 + if([cellName isEqualToString:@"Channels Present"] ||
  325 + [cellName isEqualToString:@"Product Present in Channel"] ||
  326 + [cellName isEqualToString:@"Channel Engine Status"])
303 327 {
304   - self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_iPad" bundle:nil];
305   - self.datePickerViewController.delegate = self;
306   - [self.datePickerViewController showInView:self.navigationController.view animated:YES];
  328 + NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANNELS, nil];
  329 + [newRows setArray:[newRows subarrayWithRange:NSMakeRange(0, [[self sensorStatus] numChannels])]];
  330 + if(folded)
  331 + {
  332 + [self addTags: newRows : cellTag];
  333 + [self addRowsAtIndexPath: newRows : index];
  334 + }
  335 + else
  336 + {
  337 + [self removeRowsAtIndexPath: [newRows count] : index];
  338 + }
307 339 }
308   - else
  340 + else if([cellName isEqualToString:@"Money Collected"])
309 341 {
310   - self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController" bundle:nil];
311   - self.datePickerViewController.delegate = self;
312   - [self.datePickerViewController showInView:self.navigationController.view animated:YES];
  342 + NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_IN, nil];
  343 + if(folded)
  344 + {
  345 + [self addTags: newRows : cellTag];
  346 + [self addRowsAtIndexPath: newRows : index];
  347 + }
  348 + else
  349 + {
  350 + [self removeRowsAtIndexPath: [newRows count] : index];
  351 + }
  352 + }
  353 + else if([cellName isEqualToString:@"Money Returned"])
  354 + {
  355 + NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_OUT, nil];
  356 + if(folded)
  357 + {
  358 + [self addTags: newRows : cellTag];
  359 + [self addRowsAtIndexPath: newRows : index];
  360 + }
  361 + else
  362 + {
  363 + [self removeRowsAtIndexPath: [newRows count] : index];
  364 + }
  365 + }
  366 + else if([cellName isEqualToString:@"Products Sold"])
  367 + {
  368 + NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_PRODUCTS, nil];
  369 + if(folded)
  370 + {
  371 + [self addTags: newRows : cellTag];
  372 + [self addRowsAtIndexPath: newRows : index];
  373 + }
  374 + else
  375 + {
  376 + [self removeRowsAtIndexPath: [newRows count] : index];
  377 + }
  378 + }
  379 + else if([cellName isEqualToString:@"Change Available"])
  380 + {
  381 + NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANGE, nil];
  382 + if(folded)
  383 + {
  384 + [self addTags: newRows : cellTag];
  385 + [self addRowsAtIndexPath: newRows : index];
  386 + }
  387 + else
  388 + {
  389 + [self removeRowsAtIndexPath: [newRows count] : index];
  390 + }
313 391 }
314 392 }
315   - //Update Product Price command
316   - else if([cellName isEqualToString:NSLocalizedString(@"Update product price", nil)] && [self currentNavLevel] == BASIC_CONFIGURATION)
  393 + [self reloadTable:UITableViewRowAnimationNone];
  394 +}
  395 +
  396 +- (void) addRowsAtIndexPath : (NSArray*) rows : (NSIndexPath*) indexPath
  397 +{
  398 + NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, [rows count])];
  399 + [[self currentElements] insertObjects:rows atIndexes:indexSet];
  400 + [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] + [rows count])]];
  401 +}
  402 +
  403 +- (void) removeRowsAtIndexPath : (NSUInteger) numRows : (NSIndexPath*) indexPath
  404 +{
  405 + NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, numRows)];
  406 + [[self currentElements] removeObjectsAtIndexes:indexSet];
  407 + [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] - numRows)]];
  408 +}
  409 +
  410 +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  411 +{
  412 + return [[[self currentStructure] objectAtIndex:section] intValue];
  413 +}
  414 +
  415 +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
  416 +{
  417 + NSLog(@"Section: %ld Row: %ld",(long)[indexPath section],(long)[indexPath row]);
  418 + [tableView deselectRowAtIndexPath:indexPath animated:YES];
  419 + UITableViewCell *cell = [[self tableView] cellForRowAtIndexPath:indexPath];
  420 + NSString *cellName = [[cell textLabel]text];
  421 + //Cells in MENU
  422 + if([self currentNavLevel] == MENU)
317 423 {
318   - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  424 + if([cellName isEqualToString:NSLocalizedString(@"Maintenance", nil)])
319 425 {
320   - self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_iPad" bundle:nil];
321   - self.priceChangerViewController.delegate = self;
322   - [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
  426 + NSLog(@"[MenuTableViewController.m]: Changing to navLevel: MAINTENANCE");
  427 + if([self generateMaintenanceLevel])
  428 + {
  429 + [self changeNavLevel:MAINTENANCE:TRUE];
  430 + }
  431 + else
  432 + {
  433 + NSLog(@"[MenuTableViewController.m]: Error while changing to navLevel: MAINTENANCE");
  434 + }
323 435 }
324   - else
  436 + else if([cellName isEqualToString:NSLocalizedString(@"Basic Configuration", nil)])
325 437 {
326   - self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController" bundle:nil];
327   - self.priceChangerViewController.delegate = self;
328   - [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
  438 + NSLog(@"[MenuTableViewController.m]: Changing to navLevel: BASIC_CONFIGURATION");
  439 + [self changeNavLevel:BASIC_CONFIGURATION:TRUE];
  440 + }
  441 + else if([cellName isEqualToString:NSLocalizedString(@"Sending a Report", nil)])
  442 + {
  443 +
329 444 }
330 445 }
331   - //Update Product Name command
332   - else if([cellName isEqualToString:NSLocalizedString(@"Update product name", nil)] && [self currentNavLevel] == BASIC_CONFIGURATION)
  446 + //Cells in MAINTENANCE
  447 + else if([self currentNavLevel] == MAINTENANCE)
333 448 {
334   - if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  449 + if([cellName isEqualToString:NSLocalizedString(@"Channels Present", nil)] ||
  450 + [cellName isEqualToString:NSLocalizedString(@"Product Present in Channel", nil)] ||
  451 + [cellName isEqualToString:NSLocalizedString(@"Channel Engine Status", nil)] ||
  452 + [cellName isEqualToString:NSLocalizedString(@"Money Collected", nil)] ||
  453 + [cellName isEqualToString:NSLocalizedString(@"Money Returned", nil)] ||
  454 + [cellName isEqualToString:NSLocalizedString(@"Products Sold", nil)] ||
  455 + [cellName isEqualToString:NSLocalizedString(@"Change Available", nil)])
335 456 {
336   - self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_iPad" bundle:nil];
337   - self.nameChangerViewController.delegate = self;
338   - [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
  457 + [self toggleDropList:indexPath];
339 458 }
340   - else
  459 + else if([cellName isEqualToString:NSLocalizedString(@"Sales log", nil)])
  460 + {
  461 + NSLog(@"[MenuTableViewController.m]: Changing to navLevel: SALES");
  462 + if([self generateSalesNavLevel])
  463 + {
  464 + [self changeNavLevel:SALES:TRUE];
  465 + }
  466 + else
  467 + {
  468 + NSLog(@"[MenuTableViewController.m]: Error while changing to navLevel: SALES");
  469 + }
  470 + }
  471 + }
  472 + //Cells in BASIC_CONFIGURATION
  473 + else if([self currentNavLevel] == BASIC_CONFIGURATION)
  474 + {
  475 + //Update Date & Time command
  476 + if([cellName isEqualToString:NSLocalizedString(@"Update Date & Time", nil)])
  477 + {
  478 + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  479 + {
  480 + self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_iPad" bundle:nil];
  481 + self.datePickerViewController.delegate = self;
  482 + [self.datePickerViewController showInView:self.navigationController.view animated:YES];
  483 + }
  484 + else
  485 + {
  486 + self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController" bundle:nil];
  487 + self.datePickerViewController.delegate = self;
  488 + [self.datePickerViewController showInView:self.navigationController.view animated:YES];
  489 + }
  490 + }
  491 + //Update Product Price command
  492 + else if([cellName isEqualToString:NSLocalizedString(@"Update product price", nil)])
341 493 {
342   - self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController" bundle:nil];
343   - self.nameChangerViewController.delegate = self;
344   - [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
  494 + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  495 + {
  496 + self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_iPad" bundle:nil];
  497 + self.priceChangerViewController.delegate = self;
  498 + [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
  499 + }
  500 + else
  501 + {
  502 + self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController" bundle:nil];
  503 + self.priceChangerViewController.delegate = self;
  504 + [self.priceChangerViewController showInView:self.navigationController.view animated:YES];
  505 + }
  506 + }
  507 + //Update Product Name command
  508 + else if([cellName isEqualToString:NSLocalizedString(@"Update product name", nil)])
  509 + {
  510 + if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
  511 + {
  512 + self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_iPad" bundle:nil];
  513 + self.nameChangerViewController.delegate = self;
  514 + [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
  515 + }
  516 + else
  517 + {
  518 + self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController" bundle:nil];
  519 + self.nameChangerViewController.delegate = self;
  520 + [self.nameChangerViewController showInView:self.navigationController.view animated:YES];
  521 + }
345 522 }
346 523 }
347 524 }
348 525  
349 526 #pragma mark - Table view data source
350 527  
351   -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
  528 +-(NSInteger)tableView: (UITableView *)tableView indentationLevelForRowAtIndexPath: (NSIndexPath *)indexPath
352 529 {
353   - return [[self currentStructure] count];
  530 + NSInteger indent = 0;
  531 + if([[[self currentElements] objectAtIndex:indexPath.row] characterAtIndex:0] == '*')
  532 + {
  533 + indent++;
  534 + }
  535 + return indent;
354 536 }
355 537  
356   -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
  538 +- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
357 539 {
358   - return [[[self currentStructure]objectAtIndex:section] integerValue];
  540 + return [[self currentStructure] count];
359 541 }
360 542  
361 543 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
362 544 {
  545 + Boolean needsIndent = FALSE;
  546 + Boolean foldedList = FALSE;
  547 + Boolean unfoldedList = FALSE;
363 548 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self currentCellIdentifier] forIndexPath:indexPath];
364   -
  549 + //INSTANTIATE CELL IF NEEDED
365 550 if (cell == nil)
366 551 {
367 552 NSLog(@"[MenuTableViewController.m]: Initializing cell");
... ... @@ -375,6 +560,7 @@
375 560 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self currentCellIdentifier]];
376 561 }
377 562 }
  563 + //CALCULATE TRUE ROW TO RETRIEVE NAME
378 564 uint8_t offset = 0;
379 565 if([indexPath section] )
380 566 {
... ... @@ -383,24 +569,263 @@
383 569 offset += [[[self currentStructure] objectAtIndex:i] unsignedCharValue];
384 570 }
385 571 }
386   - [[cell textLabel] setText:NSLocalizedString([[self currentElements] objectAtIndex:[indexPath row]+offset],nil)];
  572 + //RETRIEVE NAME
  573 + NSMutableString *cellText = [NSMutableString stringWithString:[[self currentElements] objectAtIndex:[indexPath row]+offset]];
  574 + //SET INDENT
  575 + [cell setIndentationWidth:10];
  576 + //PARSE AND REMOVE CELL MODIFIER
  577 + if([cellText characterAtIndex:0] == '>')
  578 + {
  579 + foldedList = TRUE;
  580 + [cellText setString:[cellText substringFromIndex:1]];
  581 + }
  582 + else if([cellText characterAtIndex:0] == 'v')
  583 + {
  584 + unfoldedList = TRUE;
  585 + [cellText setString:[cellText substringFromIndex:1]];
  586 + }
  587 + else if([cellText characterAtIndex:0] == '*')
  588 + {
  589 + needsIndent = TRUE;
  590 + [cellText setString:[cellText substringFromIndex:1]];
  591 + }
  592 + //PARSE AND REMOVE TAG
  593 + NSInteger lastPos = [cellText rangeOfString:@"]"].location;
  594 + NSInteger cellTag = [[cellText substringWithRange:NSMakeRange(1,lastPos)] intValue];
  595 + [cell setTag:cellTag];
  596 + [cellText setString:[cellText substringFromIndex:lastPos+1]];
  597 + //SET FINAL TEXT
  598 + [[cell textLabel] setText:NSLocalizedString(cellText,nil)];
  599 +
  600 + //MAINTENANCE CELLS
387 601 if([self currentNavLevel] == MAINTENANCE)
388 602 {
389   - if( [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Sales log",nil)] || [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Incident report",nil)] || [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Send report",nil)])
  603 + [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview];
  604 + [[cell detailTextLabel] setText:@""];
  605 + [cell setAccessoryView:nil];
  606 + [cell setAccessoryType:UITableViewCellAccessoryNone];
  607 + if(foldedList)
390 608 {
391   - [[cell detailTextLabel] setText:@""];
  609 + NSInteger cellHeight = cell.contentView.frame.size.height;
  610 + UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)];
  611 + imageView.image = [UIImage imageNamed:@"carat.png"];
  612 + imageView.tag = CELL_CARAT_TAG;
  613 + [cell.contentView addSubview:imageView];
  614 + }
  615 + else if(unfoldedList)
  616 + {
  617 + NSInteger cellHeight = cell.contentView.frame.size.height;
  618 + UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)];
  619 + imageView.image = [UIImage imageNamed:@"carat-open.png"];
  620 + imageView.tag = CELL_CARAT_TAG;
  621 + [cell.contentView addSubview:imageView];
  622 + }
  623 + if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channels Present",nil)])
  624 + {
  625 + [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",[[self sensorStatus] numChannels]]];
392 626 [cell setAccessoryView:nil];
393   - [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
394 627 }
395   - else
  628 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Present in Channel",nil)])
396 629 {
397   - [[cell detailTextLabel] setText:@"VALUE"];
398 630 [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
399   - if( [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"CH4 presence",nil)])
  631 + for(int i = 0; i < [[self sensorStatus] numChannels]; i++)
  632 + {
  633 + if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:i] intValue] != 1)
  634 + {
  635 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  636 + break;
  637 + }
  638 + }
  639 + }
  640 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channel Engine Status",nil)])
  641 + {
  642 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  643 + for(int i = 0; i < [[self sensorStatus] numChannels]; i++)
  644 + {
  645 + if([[[[self sensorStatus] channelStatus] objectAtIndex:i] intValue] != 1)
  646 + {
  647 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  648 + break;
  649 + }
  650 + }
  651 + }
  652 + else if([[NSRegularExpression regularExpressionWithPattern:@"Channel (\\d+)" options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0)
  653 + {
  654 + NSUInteger index = [[[[cell textLabel] text] substringFromIndex:8] intValue] - 1;
  655 + if([cell tag] == 2001) // Products Present in Channel tag
  656 + {
  657 + if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:index] intValue] == 1)
  658 + {
  659 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  660 + }
  661 + else
  662 + {
  663 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  664 + }
  665 + }
  666 + else if([cell tag] == 2002) // Channel engine status tag
  667 + {
  668 + if([[[[self sensorStatus] channelStatus] objectAtIndex:index] intValue] == 1)
  669 + {
  670 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  671 + }
  672 + else
  673 + {
  674 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  675 + }
  676 + }
  677 +
  678 + }
  679 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Door Sensor",nil)])
  680 + {
  681 + if([[self sensorStatus] doorOpen])
400 682 {
  683 + [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)];
401 684 [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
402 685 }
403   -
  686 + else
  687 + {
  688 + [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)];
  689 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  690 + }
  691 + }
  692 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Coil Sensor",nil)])
  693 + {
  694 + if([[self sensorStatus] coilOpen])
  695 + {
  696 + [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)];
  697 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  698 + }
  699 + else
  700 + {
  701 + [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)];
  702 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  703 + }
  704 + }
  705 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Collected",nil)])
  706 + {
  707 + double numCollected = 0;
  708 + numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:0] intValue] * 10;
  709 + numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:1] intValue] * 5;
  710 + numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:2] intValue] * 2;
  711 + numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:3] intValue] * 1;
  712 + numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:4] intValue] * 0.50;
  713 + [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numCollected]];
  714 + }
  715 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Returned",nil)])
  716 + {
  717 + double numReturned = 0;
  718 + numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:0] intValue] * 2;
  719 + numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:1] intValue] * 1;
  720 + numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:2] intValue] * 0.50;
  721 + [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numReturned]];
  722 + }
  723 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Products Sold",nil)])
  724 + {
  725 + NSInteger numSold = 0;
  726 + for(int i = 0; i < MAX_PRODUCTS; i++)
  727 + {
  728 + numSold += [[[[self sensorStatus] productsSold] objectAtIndex:i] intValue];
  729 + }
  730 + [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",numSold]];
  731 + }
  732 + else if([[NSRegularExpression regularExpressionWithPattern:@"Product (\\d+)" options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0)
  733 + {
  734 + NSUInteger index = [[[[cell textLabel] text] substringFromIndex:8] intValue] - 1;
  735 + if([cell tag] == 2007)
  736 + {
  737 + [[cell detailTextLabel] setText:[[[[self sensorStatus] productsSold] objectAtIndex:index] stringValue]];
  738 + }
  739 + }
  740 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Change Available",nil)])
  741 + {
  742 + [[cell detailTextLabel] setText:@""];
  743 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  744 + for(int i = 0; i < CHANGE_NUM_UNITS; i++)
  745 + {
  746 + if([[[[self sensorStatus] changeAvailable] objectAtIndex:i] intValue] != 1)
  747 + {
  748 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  749 + break;
  750 + }
  751 + }
  752 + }
  753 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"10€ Notes",nil)])
  754 + {
  755 + if([cell tag] == 2005)
  756 + {
  757 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:0] stringValue]];
  758 + }
  759 + }
  760 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"5€ Notes",nil)])
  761 + {
  762 + if([cell tag] == 2005)
  763 + {
  764 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:1] stringValue]];
  765 + }
  766 + }
  767 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"2€ Coins",nil)])
  768 + {
  769 + if([cell tag] == 2005)
  770 + {
  771 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:2] stringValue]];
  772 + }
  773 + else if([cell tag] == 2006)
  774 + {
  775 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:0] stringValue]];
  776 + }
  777 + }
  778 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"1€ Coins",nil)])
  779 + {
  780 + if([cell tag] == 2005)
  781 + {
  782 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:3] stringValue]];
  783 + }
  784 + else if([cell tag] == 2006)
  785 + {
  786 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:1] stringValue]];
  787 + }
  788 + else if([cell tag] == 2008)
  789 + {
  790 + if([[[[self sensorStatus] changeAvailable] objectAtIndex:0] intValue] == 1)
  791 + {
  792 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  793 + }
  794 + else
  795 + {
  796 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  797 + }
  798 + }
  799 + }
  800 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"50c Coins",nil)])
  801 + {
  802 + if([cell tag] == 2005)
  803 + {
  804 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:4] stringValue]];
  805 + }
  806 + else if([cell tag] == 2006)
  807 + {
  808 + [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:2] stringValue]];
  809 + }
  810 + else if([cell tag] == 2008)
  811 + {
  812 + if([[[[self sensorStatus] changeAvailable] objectAtIndex:1] intValue] == 1)
  813 + {
  814 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
  815 + }
  816 + else
  817 + {
  818 + [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
  819 + }
  820 + }
  821 + }
  822 + else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Sales log",nil)] ||
  823 + [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Incident report",nil)] ||
  824 + [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Send report",nil)])
  825 + {
  826 + [[cell detailTextLabel] setText:@""];
  827 + [cell setAccessoryView:nil];
  828 + [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
404 829 }
405 830 }
406 831 return cell;
... ... @@ -435,54 +860,4 @@
435 860 [_protocol updateProductName:channel :code :name];
436 861 }
437 862  
438   -
439   -/*
440   -// Override to support conditional editing of the table view.
441   -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
442   -{
443   - // Return NO if you do not want the specified item to be editable.
444   - return YES;
445   -}
446   -*/
447   -
448   -/*
449   -// Override to support editing the table view.
450   -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
451   -{
452   - if (editingStyle == UITableViewCellEditingStyleDelete) {
453   - // Delete the row from the data source
454   - [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
455   - } else if (editingStyle == UITableViewCellEditingStyleInsert) {
456   - // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
457   - }
458   -}
459   -*/
460   -
461   -/*
462   -// Override to support rearranging the table view.
463   -- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
464   -{
465   -}
466   -*/
467   -
468   -/*
469   -// Override to support conditional rearranging of the table view.
470   -- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
471   -{
472   - // Return NO if you do not want the item to be re-orderable.
473   - return YES;
474   -}
475   -*/
476   -
477   -/*
478   -#pragma mark - Navigation
479   -
480   -// In a storyboard-based application, you will often want to do a little preparation before navigation
481   -- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
482   -{
483   - // Get the new view controller using [segue destinationViewController].
484   - // Pass the selected object to the new view controller.
485   -}
486   -*/
487   -
488 863 @end
... ...
DUREX Vendor Control/Sale.h 0 → 100644
  1 +//
  2 +// Sale.h
  3 +// DUREX Vendor Control
  4 +//
  5 +// Created by Imanol Barba on 07/09/14.
  6 +// Copyright (c) 2014 Emmoco. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +#import "CommunicationProtocol.h"
  11 +
  12 +@interface Sale : NSObject
  13 +
  14 +@property (strong,nonatomic) NSMutableArray *moneyPaid;
  15 +@property (strong,nonatomic) NSMutableArray *moneyReturned;
  16 +@property NSString *productCode;
  17 +@property NSString *normalPrice;
  18 +@property NSString *discountedPrice;
  19 +@property NSDate *saleTime;
  20 +
  21 +- (id) init;
  22 +
  23 +@end
... ...
DUREX Vendor Control/Sale.m 0 → 100644
  1 +//
  2 +// Sale.m
  3 +// DUREX Vendor Control
  4 +//
  5 +// Created by Imanol Barba on 07/09/14.
  6 +// Copyright (c) 2014 Emmoco. All rights reserved.
  7 +//
  8 +
  9 +#import "Sale.h"
  10 +
  11 +@implementation Sale
  12 +
  13 +- (id) init
  14 +{
  15 + [self setMoneyPaid:[[NSMutableArray alloc]init]];
  16 + [self setMoneyReturned:[[NSMutableArray alloc]init]];
  17 + return self;
  18 +}
  19 +
  20 +@end
... ...
DUREX Vendor Control/SalesLog.h 0 → 100644
  1 +//
  2 +// SalesLog.h
  3 +// DUREX Vendor Control
  4 +//
  5 +// Created by Imanol Barba on 07/09/14.
  6 +// Copyright (c) 2014 Emmoco. All rights reserved.
  7 +//
  8 +
  9 +#import <Foundation/Foundation.h>
  10 +
  11 +@interface SalesLog : NSObject
  12 +
  13 +@property (strong,nonatomic) NSString *response;
  14 +@property (strong,nonatomic) NSMutableArray *sales;
  15 +
  16 +- (id) init;
  17 +- (void) setResponseValue:(NSString *)response;
  18 +
  19 +@end
... ...
DUREX Vendor Control/SalesLog.m 0 → 100644
  1 +//
  2 +// SalesLog.m
  3 +// DUREX Vendor Control
  4 +//
  5 +// Created by Imanol Barba on 07/09/14.
  6 +// Copyright (c) 2014 Emmoco. All rights reserved.
  7 +//
  8 +
  9 +#import "SalesLog.h"
  10 +
  11 +@implementation SalesLog
  12 +
  13 +- (id) init
  14 +{
  15 + [self setSales:[[NSMutableArray alloc] init]];
  16 + return self;
  17 +}
  18 +
  19 +- (void) setResponseValue:(NSString *)response
  20 +{
  21 + [self setResponse: response];
  22 + [self parseResponse];
  23 +}
  24 +
  25 +- (void) parseResponse
  26 +{
  27 +
  28 +}
  29 +
  30 +@end
... ...
DUREX Vendor Control/Sensors.h
... ... @@ -13,16 +13,16 @@
13 13  
14 14 @property (strong,nonatomic) NSString *response;
15 15 @property NSUInteger numChannels;
16   -@property NSMutableArray *channelProductAvailability;
17   -@property NSMutableArray *channelStatus;
  16 +@property (strong,nonatomic) NSMutableArray *channelProductAvailability;
  17 +@property (strong,nonatomic) NSMutableArray *channelStatus;
18 18 @property Boolean doorOpen;
19 19 @property Boolean coilOpen;
20   -@property NSMutableArray *moneyCollected;
21   -@property NSMutableArray *moneyReturned;
22   -@property NSMutableArray *productsSold;
23   -@property NSMutableArray *changeAvailable;
  20 +@property (strong,nonatomic) NSMutableArray *moneyCollected;
  21 +@property (strong,nonatomic) NSMutableArray *moneyReturned;
  22 +@property (strong,nonatomic) NSMutableArray *productsSold;
  23 +@property (strong,nonatomic) NSMutableArray *changeAvailable;
24 24  
25 25 - (id) init;
26   -- (void) setResponse:(NSString *)response;
  26 +- (void) setResponseValue:(NSString *)response;
27 27  
28 28 @end
... ...
DUREX Vendor Control/Sensors.m
... ... @@ -20,14 +20,15 @@
20 20 [self setChannelStatus:[[NSMutableArray alloc]init]];
21 21 [self setMoneyCollected:[[NSMutableArray alloc]init]];
22 22 [self setMoneyReturned:[[NSMutableArray alloc]init]];
  23 + [self setProductsSold:[[NSMutableArray alloc]init]];
23 24 [self setChangeAvailable:[[NSMutableArray alloc] init]];
24 25  
25 26 return self;
26 27 }
27 28  
28   -- (void) setResponse:(NSString *)response
  29 +- (void) setResponseValue:(NSString *)response
29 30 {
30   - self.response = response;
  31 + [self setResponse:response];
31 32 [self parseResponse];
32 33 }
33 34  
... ... @@ -38,13 +39,18 @@
38 39 uint16_t channelAvailability = 0;
39 40 uint16_t channelMotors = 0;
40 41  
  42 + NSRange substrRange;
  43 + substrRange.length = 5;
  44 + substrRange.location = 2;
  45 +
  46 + channelStatus = [[[self response] substringWithRange:substrRange] intValue];
  47 + substrRange.location += 5;
  48 +
  49 + channelAvailability = [[[self response] substringWithRange:substrRange] intValue];
  50 + substrRange.location += 5;
41 51  
42   - channelStatus |= [[self response] characterAtIndex:2];
43   - channelStatus |= ([[self response] characterAtIndex:3] << 8);
44   - channelAvailability |= [[self response] characterAtIndex:4];
45   - channelAvailability |= ([[self response] characterAtIndex:5] << 8);
46   - channelMotors |= [[self response] characterAtIndex:6];
47   - channelMotors |= ([[self response] characterAtIndex:7] << 8);
  52 + channelMotors = [[[self response] substringWithRange:substrRange] intValue];
  53 + substrRange.location += 5;
48 54  
49 55 for(int i = 0; i < MAX_CHANNELS; i++)
50 56 {
... ... @@ -52,7 +58,7 @@
52 58 {
53 59 channelCount++;
54 60 }
55   - channelStatus <<= 1;
  61 + channelStatus >>= 1;
56 62 }
57 63 [self setNumChannels:channelCount];
58 64  
... ... @@ -66,7 +72,7 @@
66 72 {
67 73 [[self channelProductAvailability] insertObject:[NSNumber numberWithBool:FALSE] atIndex:i];
68 74 }
69   - channelAvailability <<= 1;
  75 + channelAvailability >>= 1;
70 76 }
71 77  
72 78 for(int i = 0; i < MAX_CHANNELS; i++)
... ... @@ -79,10 +85,10 @@
79 85 {
80 86 [[self channelStatus] insertObject:[NSNumber numberWithBool:FALSE] atIndex:i];
81 87 }
82   - channelMotors <<= 1;
  88 + channelMotors >>= 1;
83 89 }
84 90  
85   - if([[self response] characterAtIndex:8] == '1')
  91 + if([[self response] characterAtIndex:17] == '1')
86 92 {
87 93 [self setDoorOpen:TRUE];
88 94 }
... ... @@ -91,7 +97,7 @@
91 97 [self setDoorOpen:FALSE];
92 98 }
93 99  
94   - if([[self response] characterAtIndex:9] == '1')
  100 + if([[self response] characterAtIndex:18] == '1')
95 101 {
96 102 [self setCoilOpen:TRUE];
97 103 }
... ... @@ -99,16 +105,15 @@
99 105 {
100 106 [self setCoilOpen:FALSE];
101 107 }
102   - NSRange substrRange;
103 108 substrRange.length = 3;
104   - substrRange.location = 10;
  109 + substrRange.location = 19;
105 110  
106   - for(int i = 0; i < MONEY_NUM_UNITS; i++)
  111 + for(int i = 0; i < MONEY_IN_NUM_UNITS; i++)
107 112 {
108 113 [[self moneyCollected] insertObject:[NSNumber numberWithInt:[[[self response] substringWithRange:substrRange] intValue]] atIndex:i];
109 114 substrRange.location += 3;
110 115 }
111   - for(int i = 0; i < MONEY_NUM_UNITS; i++)
  116 + for(int i = 0; i < MONEY_OUT_NUM_UNITS; i++)
112 117 {
113 118 [[self moneyReturned] insertObject:[NSNumber numberWithInt:[[[self response] substringWithRange:substrRange] intValue]] atIndex:i];
114 119 substrRange.location += 3;
... ... @@ -121,7 +126,7 @@
121 126 substrRange.location += 2;
122 127 }
123 128  
124   - if([[self response] characterAtIndex:64] == '1')
  129 + if([[self response] characterAtIndex:75] == '1')
125 130 {
126 131 [[self changeAvailable]insertObject:[NSNumber numberWithBool:TRUE] atIndex:0];
127 132 }
... ... @@ -130,7 +135,7 @@
130 135 [[self changeAvailable]insertObject:[NSNumber numberWithBool:FALSE] atIndex:0];
131 136 }
132 137  
133   - if([[self response] characterAtIndex:65] == '1')
  138 + if([[self response] characterAtIndex:76] == '1')
134 139 {
135 140 [[self changeAvailable]insertObject:[NSNumber numberWithBool:TRUE] atIndex:1];
136 141 }
... ... @@ -138,8 +143,6 @@
138 143 {
139 144 [[self changeAvailable]insertObject:[NSNumber numberWithBool:FALSE] atIndex:1];
140 145 }
141   -
142   -
143 146 }
144 147  
145 148 @end
... ...
DUREX Vendor Control/carat-open.png 0 → 100644

870 Bytes

DUREX Vendor Control/carat.png 0 → 100644

180 Bytes

DUREX Vendor Control/en.lproj/Localizable.strings
... ... @@ -34,8 +34,10 @@
34 34 "Channel Engine Status" = "Channel Engine Status";
35 35 "Door Sensor" = "Door Sensor";
36 36 "Coil Sensor" = "Coil Sensor";
  37 +"OPEN" = "OPEN";
  38 +"CLOSED" = "CLOSED";
37 39 "Money Collected" = "Money Collected";
38   -"Money Given" = "Money Given";
  40 +"Money Returned" = "Money Returned";
39 41 "Products Sold" = "Products Sold";
40 42 "Product 1" = "Product 1";
41 43 "Product 2" = "Product 2";
... ... @@ -72,7 +74,7 @@
72 74 "50c Coins" = "50c Coins";
73 75 "Channel" = "Channel";
74 76 "Product Code" = "Product Code";
75   -"Nominal Price" = "Nominal Price";
  77 +"Normal Price" = "Normal Price";
76 78 "Discounted Price" = "Discounted Price";
77 79 "1€ Change" = "1€ Change";
78 80 "50c Change" = "50c Change";
... ...
DUREX Vendor Control/es.lproj/Localizable.strings
... ... @@ -34,8 +34,10 @@
34 34 "Channel Engine Status" = "Estado de los motores";
35 35 "Door Sensor" = "Sensor de puerta";
36 36 "Coil Sensor" = "Sensor de bobina";
  37 +"OPEN" = "ABIERTO";
  38 +"CLOSED" = "CERRADO";
37 39 "Money Collected" = "Recaudación efectuada";
38   -"Money Given" = "Efectivo devuelto";
  40 +"Money Returned" = "Efectivo devuelto";
39 41 "Products Sold" = "Productos vendidos";
40 42 "Product 1" = "Producto 1";
41 43 "Product 2" = "Producto 2";
... ... @@ -72,7 +74,7 @@
72 74 "50c Coins" = "Monedas de 50c";
73 75 "Channel" = "Canal";
74 76 "Product Code" = "Código del producto";
75   -"Nominal Price" = "Precio Nominal";
  77 +"Normal Price" = "Precio Normal";
76 78 "Discounted Price" = "Precio con descuento";
77 79 "1€ Change" = "Cambio de 1€";
78 80 "50c Change" = "Cambio de 50c";
... ...
DUREX tests/DUREX test.xcodeproj/project.xcworkspace/xcuserdata/imanol.xcuserdatad/UserInterfaceState.xcuserstate
No preview for this file type
DUREX tests/DUREX test.xcodeproj/xcuserdata/imanol.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
... ... @@ -31,8 +31,8 @@
31 31 endingColumnNumber = "9223372036854775807"
32 32 startingLineNumber = "32"
33 33 endingLineNumber = "32"
34   - landmarkName = "-viewDidLoad"
35   - landmarkType = "5">
  34 + landmarkName = "@implementation InitialViewController"
  35 + landmarkType = "3">
36 36 </BreakpointContent>
37 37 </BreakpointProxy>
38 38 </Breakpoints>
... ...
1 1 BUGS:
2 2 - messageAvailable checks and status checks NOT working (long operations)
3 3 - On date change, response is overwritten by previous query, trimming needed according to numBytes
  4 +- Sanitize input on name/price change
  5 +- Seemingly random crashes
4 6  
5 7 TODO:
6   -- Sensors class
7   -- A4 parser
8   -- Dropdown cells
9   -- Generate view
10 8  
11   -- Sale class
12 9 - A2 command
13 10 - Sale parser
14 11 - Generate view
... ... @@ -16,6 +13,8 @@ TODO:
16 13 - Implement sensor status logging and sending to remote server
17 14 - Lewis infrastructure for data viewing (SQL, Webpage, CSV parser)
18 15  
  16 +- Channels and codes to 2 ciphers
  17 +
19 18 - Incident class
20 19 - Incident parser
21 20 - A3 command
... ...