// // MenuTableViewController.m // DUREX Vendor Control // // Created by Imanol Barba on 5/23/14. // Copyright (c) 2014 Emmoco. All rights reserved. // #import "MenuTableViewController.h" @interface MenuTableViewController () { IBOutlet UIActivityIndicatorView *_activityIndicator; NSTimer *_writeTimer; } //NAVIGATION LEVELS LAYOUT AND CELL IDENTIFIERS @property (nonatomic,strong) const NSMutableArray *menuElements; @property (nonatomic,strong) const NSMutableArray *menuStructure; @property (nonatomic,strong) const NSMutableArray *menuHeaders; @property (nonatomic,strong) const NSMutableArray *maintenanceElements; @property (nonatomic,strong) const NSMutableArray *maintenanceStructure; @property (nonatomic,strong) const NSMutableArray *maintenanceHeaders; @property (nonatomic,strong) const NSMutableArray *saleListElements; @property (nonatomic,strong) const NSMutableArray *saleListStructure; @property (nonatomic,strong) const NSMutableArray *saleListHeaders; @property (nonatomic,strong) const NSMutableArray *saleElements; @property (nonatomic,strong) const NSMutableArray *saleStructure; @property (nonatomic,strong) const NSMutableArray *saleHeaders; @property (nonatomic,strong) const NSMutableArray *incidentListElements; @property (nonatomic,strong) const NSMutableArray *incidentListStructure; @property (nonatomic,strong) const NSMutableArray *incidentListHeaders; @property (nonatomic,strong) const NSMutableArray *incidentElements; @property (nonatomic,strong) const NSMutableArray *incidentStructure; @property (nonatomic,strong) const NSMutableArray *incidentHeaders; @property (nonatomic,strong) const NSMutableArray *configElements; @property (nonatomic,strong) const NSMutableArray *configStructure; @property (nonatomic,strong) const NSMutableArray *configHeaders; @property (nonatomic,strong) const NSArray *cellIdentifiers; //NAVIGATION LEVEL ATTRIBUTES @property (strong,nonatomic) NSMutableArray *childViewControllers; @property uint8_t currentNavLevel; @property Boolean showIndexes; @property (strong,nonatomic) NSString *currentCellIdentifier; @property (strong,nonatomic) const NSMutableArray *currentElements; @property (strong,nonatomic) const NSMutableArray *currentStructure; @property (strong,nonatomic) const NSMutableArray *currentHeaders; //GENERAL ATTRIBUTES @property (nonatomic,strong) CommunicationProtocol* protocol; @property (strong,nonatomic) NSString *machineMACAddr; @property (strong,nonatomic) BTAppDelegate *appDelegate; @property (strong,nonatomic) Stack *parentLayout; @property (strong,nonatomic) NSTimer *timeoutTimer; @property (strong,nonatomic) NSMutableArray *batchCommands; @property (strong,nonatomic) Sensors *sensorStatus; @property (strong,nonatomic) SalesLog *salesLog; @property (strong,nonatomic) Sale *currentSale; @property (strong,nonatomic) IncidentLog *incidentLog; @property (strong,nonatomic) Incident *currentIncident; @property uint8_t requestedLog; @property uint8_t sentCommand; //CHILD VIEW CONTOLLERS @property (strong,nonatomic) DatePickerViewController *datePickerViewController; @property (strong,nonatomic) PriceChangerViewController *priceChangerViewController; @property (strong,nonatomic) NameChangerViewController *nameChangerViewController; @property (strong,nonatomic) DateRangePickerViewController *dateRangePickerViewController; @end @implementation MenuTableViewController //NAVIGATION LEVELS GENERATION AND NAVIGATION - (void) initializeMenuEntries { [self setMenuElements:[[NSMutableArray alloc] initWithObjects:MENU_ELEMENTS, nil]]; [self setMenuStructure:[[NSMutableArray alloc] initWithObjects:MENU_CELLS_PER_SECTION, nil]]; if([[self menuStructure] count] > 1) { [self setMenuHeaders:[[NSMutableArray alloc] initWithObjects:MENU_HEADERS, nil]]; } else { [self setMenuHeaders:nil]; } [self setConfigElements:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_ELEMENTS, nil]]; [self setConfigStructure:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_CELLS_PER_SECTION, nil]]; if([[self configStructure] count] > 1) { [self setConfigHeaders:[[NSMutableArray alloc] initWithObjects:CONFIGURATION_HEADERS, nil]]; } else { [self setConfigHeaders:nil]; } [self setCellIdentifiers:[[NSArray alloc] initWithObjects:CELL_IDENTIFIERS, nil]]; } - (void) generateMaintenanceLevel : (NSString *) response { [self setSensorStatus:[[Sensors alloc]init]]; [[self sensorStatus] setResponseValue:response]; [self setMaintenanceElements:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_ELEMENTS, nil]]; [self setMaintenanceStructure:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_CELLS_PER_SECTION, nil]]; if([[self maintenanceStructure] count] > 1) { [self setMaintenanceHeaders:[[NSMutableArray alloc] initWithObjects:MAINTENANCE_HEADERS, nil]]; } else { [self setMaintenanceHeaders:nil]; } } - (void) generateSaleListNavLevel : (NSString*) response { [self setSalesLog:[[SalesLog alloc]init]]; [[self salesLog] setResponseValue:response]; NSMutableArray *dateArray = [[NSMutableArray alloc] init]; NSMutableArray *dateHeaderArray = [[NSMutableArray alloc] init]; NSMutableArray *dateStructure = [[NSMutableArray alloc] init]; NSUInteger headerPos = 0; NSUInteger headerCount = 0; NSString *lastDate = @""; NSString *currentDate; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; for(int i = 0; i < [[[self salesLog] sales]count]; i++) { Sale *currentSale = [[[self salesLog] sales]objectAtIndex:i]; NSDateComponents *components = [calendar components:units fromDate:[currentSale saleTime]]; [dateArray insertObject:[NSString stringWithFormat:@"[%d%d%d%d%d]%02d/%02d/%d %02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components day],[components month],[components year],[components hour],[components minute]] atIndex:i]; currentDate = [NSString stringWithFormat:@"%02d/%d",[components month],[components year]]; if([lastDate isEqualToString:@""]) { headerCount = 1; lastDate = currentDate; } else if(![currentDate isEqualToString:lastDate]) { [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos]; [dateHeaderArray insertObject:lastDate atIndex:headerPos]; headerCount = 1; headerPos++; lastDate = currentDate; } else { headerCount++; } } [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos]; [dateHeaderArray insertObject:lastDate atIndex:headerPos]; [self setSaleListElements:[[NSMutableArray alloc] initWithArray:dateArray]]; [self setSaleListStructure:[[NSMutableArray alloc] initWithArray:dateStructure]]; [self setSaleListHeaders:[[NSMutableArray alloc] initWithArray:dateHeaderArray]]; } - (Boolean) generateSaleNavLevel : (NSInteger) numSale { [self setSaleElements:[[NSMutableArray alloc] initWithObjects:SALE_ELEMENTS, nil]]; [self setSaleStructure:[[NSMutableArray alloc] initWithObjects:SALE_CELLS_PER_SECTION, nil]]; if([[self saleStructure] count] > 1) { [self setSaleHeaders:[[NSMutableArray alloc] initWithObjects:SALE_HEADERS, nil]]; } else { [self setSaleHeaders:nil]; } [self setCurrentSale:[[[self salesLog]sales]objectAtIndex:numSale]]; return TRUE; } - (void) generateIncidentListNavLevel : (NSString*) response { [self setIncidentLog:[[IncidentLog alloc]init]]; [[self incidentLog] setResponseValue:response]; NSMutableArray *dateArray = [[NSMutableArray alloc] init]; NSMutableArray *dateHeaderArray = [[NSMutableArray alloc] init]; NSMutableArray *dateStructure = [[NSMutableArray alloc] init]; NSUInteger headerPos = 0; NSUInteger headerCount = 0; NSString *lastDate = @""; NSString *currentDate; NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; for(int i = 0; i < [[[self incidentLog] incidents]count]; i++) { Incident *currentIncident = [[[self incidentLog] incidents]objectAtIndex:i]; NSDateComponents *components = [calendar components:units fromDate:[currentIncident incidentTime]]; [dateArray insertObject:[NSString stringWithFormat:@"[%d%d%d%d%d]%02d/%02d/%d %02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components day],[components month],[components year],[components hour],[components minute]] atIndex:i]; currentDate = [NSString stringWithFormat:@"%02d/%d",[components month],[components year]]; if([lastDate isEqualToString:@""]) { headerCount = 1; lastDate = currentDate; } else if(![currentDate isEqualToString:lastDate]) { [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos]; [dateHeaderArray insertObject:lastDate atIndex:headerPos]; headerCount = 1; headerPos++; lastDate = currentDate; } else { headerCount++; } } [dateStructure insertObject:[NSNumber numberWithInt:headerCount] atIndex:headerPos]; [dateHeaderArray insertObject:lastDate atIndex:headerPos]; [self setIncidentListElements:[[NSMutableArray alloc] initWithArray:dateArray]]; [self setIncidentListStructure:[[NSMutableArray alloc] initWithArray:dateStructure]]; [self setIncidentListHeaders:[[NSMutableArray alloc] initWithArray:dateHeaderArray]]; } - (Boolean) generateIncidentNavLevel : (NSInteger) numIncident { [self setIncidentElements:[[NSMutableArray alloc] initWithObjects:INCIDENT_ELEMENTS, nil]]; [self setIncidentStructure:[[NSMutableArray alloc] initWithObjects:INCIDENT_CELLS_PER_SECTION, nil]]; if([[self incidentStructure] count] > 1) { [self setIncidentHeaders:[[NSMutableArray alloc] initWithObjects:INCIDENT_HEADERS, nil]]; } else { [self setIncidentHeaders:nil]; } [self setCurrentIncident:[[[self incidentLog]incidents]objectAtIndex:numIncident]]; return TRUE; } - (void) changeNavLevel: (uint8_t) level : (BOOL) push { NSLog(@"[MenuTableViewController.m]: Changing to navLevel %d",level); self.showIndexes = FALSE; if(push) { [[self parentLayout] push: [NSNumber numberWithUnsignedChar:self.currentNavLevel]]; } [self setCurrentNavLevel:level]; [self setCurrentCellIdentifier:[[self cellIdentifiers] objectAtIndex:[self currentNavLevel]]]; if([self currentNavLevel] == MENU) { [self setMachineMACAddr:[[[EMConnectionManager sharedManager] connectedDevice] name]]; [[self navigationItem] setTitle:[self machineMACAddr]]; [self setCurrentElements:[self menuElements]]; [self setCurrentStructure:[self menuStructure]]; [self setCurrentHeaders:[self menuHeaders]]; } else if([self currentNavLevel] == MAINTENANCE) { [[self navigationItem] setTitle:NSLocalizedString(@"Maintenance", nil)]; [self setCurrentElements:[self maintenanceElements]]; [self setCurrentStructure:[self maintenanceStructure]]; [self setCurrentHeaders:[self maintenanceHeaders]]; } else if([self currentNavLevel] == SALE_LIST) { self.showIndexes = TRUE; [[self navigationItem] setTitle:NSLocalizedString(@"Sales log", nil)]; [self setCurrentElements:[self saleListElements]]; [self setCurrentStructure:[self saleListStructure]]; [self setCurrentHeaders:[self saleListHeaders]]; } else if([self currentNavLevel] == SALE) { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:[[self currentSale] saleTime]]; [[self navigationItem] setTitle:[NSString stringWithFormat:@"%@ %02d/%02d/%d %02d:%02d",NSLocalizedString(@"Sale on", nil),[components day],[components month],[components year],[components hour],[components minute]]]; [self setCurrentElements:[self saleElements]]; [self setCurrentStructure:[self saleStructure]]; [self setCurrentHeaders:[self saleHeaders]]; } else if([self currentNavLevel] == INCIDENT_LIST) { self.showIndexes = TRUE; [[self navigationItem] setTitle:NSLocalizedString(@"Incident log", nil)]; [self setCurrentElements:[self incidentListElements]]; [self setCurrentStructure:[self incidentListStructure]]; [self setCurrentHeaders:[self incidentListHeaders]]; } else if([self currentNavLevel] == INCIDENT) { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:[[self currentIncident] incidentTime]]; [[self navigationItem] setTitle:[NSString stringWithFormat:@"%@ %02d/%02d/%d %02d:%02d",NSLocalizedString(@"Incident on", nil),[components day],[components month],[components year],[components hour],[components minute]]]; [self setCurrentElements:[self incidentElements]]; [self setCurrentStructure:[self incidentStructure]]; [self setCurrentHeaders:[self incidentHeaders]]; } else if([self currentNavLevel] == BASIC_CONFIGURATION) { [[self navigationItem] setTitle:NSLocalizedString(@"Basic Configuration", nil)]; [self setCurrentElements:[self configElements]]; [self setCurrentStructure:[self configStructure]]; [self setCurrentHeaders:[self configHeaders]]; } //AND SO ON... [self reloadTable:UITableViewRowAnimationAutomatic]; } - (void) reloadTable: (UITableViewRowAnimation) animation { [[self tableView] reloadData]; NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:[self tableView]]); NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range]; [[self tableView] reloadSections:sections withRowAnimation:animation]; } - (void) navBack { NSNumber *prevLevel = [[self parentLayout] pop]; self.currentNavLevel = prevLevel.intValue; [self changeNavLevel: prevLevel.intValue : FALSE]; } - (void) backButtonPressed: (id) sender { NSLog(@"[MenuTableViewController.m]: Navigation Stack has %ld remaining levels",(long)[[self parentLayout] count]); if([[self parentLayout] count] > 0) { NSLog(@"[MenuTableViewController.m]: Falling to previous navigation level"); [self navBack]; } else { NSLog(@"[MenuTableViewController.m]: No more navigation levels in stack, falling to previous view"); [_protocol disconnect]; [self.navigationController popViewControllerAnimated:YES]; } } //MAINTENANCE REPORT SENDING - (void) sendMaintenanceReport : (NSString*) status : (NSString*) date : (NSString*) machineid { NSString *content = [NSString stringWithFormat:@"status=%@&date=%@&machineid=%@",status,date,machineid]; NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:REPORT_SERVER_URL]]; [request setHTTPMethod:@"POST"]; [request setHTTPBody:[content dataUsingEncoding:NSUTF8StringEncoding]]; [NSURLConnection connectionWithRequest:request delegate:self]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { NSLog(@"[MenuTableViewController.m]: Received response from report server: %@",[NSString stringWithUTF8String:[data bytes]]); [self.view makeToast:NSLocalizedString(@"Report sent successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Success!", nil) image:[UIImage imageNamed:@"icon_checkmark"]]; } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { NSLog(@"[MenuTableViewController.m]: Error connecting to server: %@ %@",[error localizedDescription],[[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]); [self.view makeToast:NSLocalizedString(@"Connection to server failed", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; } //PROTOCOL ERROR CALLBACK - (void) reportProtocolError: (CommunicationProtocol*)protocol didFinishEnteringItem:(NSString*) error { if(self.currentNavLevel == 255) { [self processMessage:protocol didFinishEnteringItem:@"ERROR"]; } else { [self.view makeToast:error duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; } } //MESSAGE RECEIVED CALLBACK - (void)processMessage:(CommunicationProtocol*)protocol didFinishEnteringItem:(NSString*) response { NSLog(@"[MenuTableViewController.m]: Answer received: %@",response); [self.timeoutTimer invalidate]; if(self.sentCommand == HELLO) { if([response isEqualToString:@"Hello"]) { NSLog(@"[MenuTableViewController.m]: Connection established"); [self changeNavLevel:MENU:FALSE]; } else { NSLog(@"[CommunicationProtocol.m]: Error while establishing connection"); UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Communication error",nil) message:NSLocalizedString(@"Error while trying to connect to the device",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; UIViewController *previous = [[[self navigationController] viewControllers] objectAtIndex:[[[self navigationController] viewControllers] count]-2]; [[self navigationController] popToViewController:previous animated:YES]; } } else if(self.sentCommand == A2 && [[response substringToIndex:2]isEqualToString:@"P2"]) { NSLog(@"[MenuTableViewController.m]: Received A2 answer"); [self generateSaleListNavLevel : response]; [self changeNavLevel:SALE_LIST:TRUE]; } else if(self.sentCommand == A3 && [[response substringToIndex:2]isEqualToString:@"P3"]) { NSLog(@"[MenuTableViewController.m]: Received A3 answer"); [self generateIncidentListNavLevel : response]; [self changeNavLevel:INCIDENT_LIST:TRUE]; } else if(self.sentCommand == A4 && [[response substringToIndex:2]isEqualToString:@"P4"]) { NSLog(@"[MenuTableViewController.m]: Received A4 answer"); [self generateMaintenanceLevel : response]; [self changeNavLevel:MAINTENANCE:TRUE]; } else if(self.sentCommand == A5 && [[response substringToIndex:2]isEqualToString:@"P5"]) { NSLog(@"[MenuTableViewController.m]: Received A5 answer"); if([response isEqualToString:@"P51"]) { [self.view makeToast:NSLocalizedString(@"Time and Date changed successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:nil image:[UIImage imageNamed:@"icon_checkmark"]]; } else if([response isEqualToString:@"P52"]) { NSLog(@"[MenuTableViewController.m]: Device returned error for command A5"); [self.view makeToast:NSLocalizedString(@"Time and Date change returned error", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; } } else if(self.sentCommand == A6 && [[response substringToIndex:2]isEqualToString:@"P6"]) { NSLog(@"[MenuTableViewController.m]: Received A6 answer"); if([response isEqualToString:@"P61"]) { [self.view makeToast:NSLocalizedString(@"Product price changed successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:nil image:[UIImage imageNamed:@"icon_checkmark"]]; } else if([response isEqualToString:@"P62"]) { NSLog(@"[MenuTableViewController.m]: Device returned error for command A6"); [self.view makeToast:NSLocalizedString(@"Product price change returned error", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; } } else if(self.sentCommand == A7 && [[response substringToIndex:2]isEqualToString:@"P7"]) { NSLog(@"[MenuTableViewController.m]: Received A7 answer"); if([response isEqualToString:@"P71"]) { [self.view makeToast:NSLocalizedString(@"Product name changed successfully", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:nil image:[UIImage imageNamed:@"icon_checkmark"]]; } else if([response isEqualToString:@"P72"]) { NSLog(@"[MenuTableViewController.m]: Device returned error for command A7"); [self.view makeToast:NSLocalizedString(@"Product name change returned error", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; } } else if(self.sentCommand == BATCH_COMMANDS) { if(self.batchCommands.count) { [self processBatchCommands]; } else { self.sentCommand = NONE; } return; } else { NSLog(@"[MenuTableViewController]: Unknown response received. Data discarded."); } [self setSentCommand:NONE]; } - (void) startTimeoutTimer { self.timeoutTimer = [NSTimer scheduledTimerWithTimeInterval:10 target:self selector:@selector(commandDidTimeout:) userInfo:nil repeats:NO]; } - (void) commandDidTimeout:(NSTimer *) timer { if(self.currentNavLevel == 255) { [self processMessage:nil didFinishEnteringItem:@"ERROR"]; } else { [self setSentCommand:NONE]; [self.view makeToast:NSLocalizedString(@"Device answer timeout occurred", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; } } //BATCH COMMAND PROCESSING - (void) processBatchCommands { NSString *command = [self.batchCommands objectAtIndex:0]; [self.batchCommands removeObjectAtIndex:0]; [_protocol writeMessage:command]; [self setSentCommand:BATCH_COMMANDS]; [self startTimeoutTimer]; } -(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { if (alertView.tag == BATCH_ALERT_TAG) { if (buttonIndex == 1) { [self processBatchCommands]; } } } - (void) handleOpenURL:(NSURL *)url { NSData *data = [NSData dataWithContentsOfURL:url]; NSString *contents = [[NSString alloc] initWithData: data encoding:NSUTF8StringEncoding]; if(data == nil) { NSLog(@"[MenuTableViewController.m]: Error obtaining data from URL"); [self.view makeToast:NSLocalizedString(@"Error obtaining data from URL", nil) duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; return; } NSLog(@"[MenuTableViewController.m]: Read file contents from handled URL: %@",contents); NSError *error = nil; NSDictionary *JSONData = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error: &error]; if(!JSONData) { NSLog(@"[MenuTableViewController.m]: %@",error); [self.view makeToast:[error localizedDescription] duration:3 position:[NSValue valueWithCGPoint:CGPointMake(self.view.frame.size.width/2,self.view.frame.size.height/2)] title:NSLocalizedString(@"Error", nil) image:[UIImage imageNamed:@"icon_delete"]]; return; } NSString *version = [JSONData objectForKey:@"version"]; NSString *name = [JSONData objectForKey:@"name"]; NSString *machineID = [JSONData objectForKey:@"machineID"]; NSArray *commands = [JSONData objectForKey:@"commands"]; NSString *errorString = nil; UIAlertView *alert; if(version == nil || commands == nil) { errorString = NSLocalizedString(@"Missing fields version and/or commands in JSON file",nil); } else if(![version isEqualToString:self.appDelegate.currentVersion]) { errorString = NSLocalizedString(@"Version mismatch",nil); } else { self.batchCommands = [[NSMutableArray alloc] initWithArray:commands]; if([name isEqualToString:@""]) { name = @"file"; } if(![machineID isEqualToString:self.machineMACAddr]) { alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Confirmation",nil) message:[NSString stringWithFormat:@"%@ \"%@\"?\n\n%@",NSLocalizedString(@"Do you want to run batch command file",nil),name,NSLocalizedString(@"WARNING: Machine ID does not match currently connected machine. Do you wish to continue?",nil)] delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel",nil) otherButtonTitles:NSLocalizedString(@"OK",nil), nil]; } else { alert = [[UIAlertView alloc] initWithTitle: NSLocalizedString(@"Confirmation",nil) message: [NSString stringWithFormat:@"%@ \"%@\"?",NSLocalizedString(@"Do you want to run batch command file",nil),name] delegate:self cancelButtonTitle:NSLocalizedString(@"Cancel",nil) otherButtonTitles:NSLocalizedString(@"OK",nil), nil]; } } if(errorString != nil) { alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:[NSString stringWithFormat:@"%@",errorString] delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; } alert.tag = BATCH_ALERT_TAG; [alert show]; } //UITABLEVIEWCONTROLLER FUNCTIONS - (void)viewDidLoad { [super viewDidLoad]; [_activityIndicator setHidden:YES]; self.appDelegate = [[UIApplication sharedApplication] delegate]; //Set navigation bar UIImage *backImage = [UIImage imageNamed:@"back_arrow.png"]; UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; backButton.frame = CGRectMake(0, 0, backImage.size.width/2, backImage.size.height/2); [backButton setImage:backImage forState:UIControlStateNormal]; [backButton addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; self.navigationItem.hidesBackButton = YES; self.navigationItem.leftBarButtonItem = backBarButtonItem; //Emmoco protocol initialization _protocol = [CommunicationProtocol sharedProtocol]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNotification:) name:kEMConnectionDidReceiveIndicatorNotificationName object:nil]; [[EMConnectionManager sharedManager] addObserver:self forKeyPath:@"connectionState" options:0 context:NULL]; self.protocol.delegate = self; //Initialize parentLayout stack [self setParentLayout:[[Stack alloc]init]]; //Set navigation level [self initializeMenuEntries]; [self setChildViewControllers:[[NSMutableArray alloc]init]]; self.currentNavLevel = 255; //Initialize menu view [_protocol establishConnection]; [self setSentCommand:HELLO]; [self startTimeoutTimer]; //Detect handled URL if(self.appDelegate.handledURL != nil) { NSLog(@"[MenuTableViewController.m]: Detected handled URL in appDelegate"); [self handleOpenURL: self.appDelegate.handledURL]; } } -(void)didReceiveNotification:(NSNotification*) notification { } -(void)dealloc { [[EMConnectionManager sharedManager] removeObserver:self forKeyPath:@"connectionState"]; [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { for(int i = 0; i < self.childViewControllers.count; i++) { ChildViewController *childController = [self.childViewControllers objectAtIndex:i]; [childController parentViewControllerDidRotateWithOrientation: [[UIDevice currentDevice] orientation]]; } } - (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { for(int i = 0; i < self.childViewControllers.count; i++) { ChildViewController *childController = [self.childViewControllers objectAtIndex:i]; [childController parentViewControllerWillRotateToInterfaceOrientation:toInterfaceOrientation duration:duration]; } } - (void)removeChildFromParentController:(ChildViewController*)controller { [self.childViewControllers removeObject:controller]; NSLog(@"[MenuTableViewController]: %d childViewControllers left",self.childViewControllers.count); } -(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (object == [EMConnectionManager sharedManager]) { if ([keyPath isEqualToString:@"connectionState"]) { if ([[EMConnectionManager sharedManager] connectionState] == EMConnectionStateDisrupted) { UIViewController *previous = [[[self navigationController] viewControllers] objectAtIndex:[[[self navigationController] viewControllers] count]-2]; UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Communication error",nil) message:NSLocalizedString(@"Connection lost",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; [[self navigationController] popToViewController:previous animated:YES]; } } } } #pragma mark - Table view delegate //CELL PROCESSING AND CUSTOMIZATION - (void) addTags : (NSMutableArray*) rows : (NSInteger) tag { for(int i = 0; i < [rows count]; i++) { NSMutableString *name = [NSMutableString stringWithString:[rows objectAtIndex:i]]; [name insertString:[NSString stringWithFormat:@"[%d]",tag] atIndex:1]; [rows replaceObjectAtIndex:i withObject:name]; } } - (void) toggleDropList : (NSIndexPath*) index { Boolean folded = FALSE; NSString *elementName = [[self currentElements] objectAtIndex:index.row]; NSMutableString *newElementName = [[NSMutableString alloc] init]; if([elementName characterAtIndex:0] == '>') { [newElementName setString:@"v"]; [newElementName appendString:[elementName substringFromIndex:1]]; folded = TRUE; } else { [newElementName setString:@">"]; [newElementName appendString:[elementName substringFromIndex:1]]; } [[self currentElements] replaceObjectAtIndex:index.row withObject:newElementName]; NSMutableString *cellName = [NSMutableString stringWithString:[elementName substringFromIndex:1]]; NSInteger lastPos = [cellName rangeOfString:@"]"].location; NSInteger cellTag = [[cellName substringWithRange:NSMakeRange(1,lastPos)] intValue]; [cellName setString:[cellName substringFromIndex:lastPos+1]]; //Cells in MENU if([self currentNavLevel] == MAINTENANCE) { if([cellName isEqualToString:@"Channels Present"] || [cellName isEqualToString:@"Product Present in Channel"] || [cellName isEqualToString:@"Channel Engine Status"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANNELS, nil]; [newRows setArray:[newRows subarrayWithRange:NSMakeRange(0, [[self sensorStatus] numChannels])]]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Money Collected"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_IN, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Money Returned"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_MONEY_OUT, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Products Sold"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_PRODUCTS, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Change Available"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:MAINTENANCE_CHANGE, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } } else if([self currentNavLevel] == SALE) { if([cellName isEqualToString:@"Money Paid"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:SALE_MONEY_PAID, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } else if([cellName isEqualToString:@"Money Returned"]) { NSMutableArray *newRows = [[NSMutableArray alloc] initWithObjects:SALE_MONEY_RETURNED, nil]; if(folded) { [self addTags: newRows : cellTag]; [self addRowsAtIndexPath: newRows : index]; } else { [self removeRowsAtIndexPath: [newRows count] : index]; } } } [self reloadTable:UITableViewRowAnimationNone]; } - (void) addRowsAtIndexPath : (NSArray*) rows : (NSIndexPath*) indexPath { NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, [rows count])]; [[self currentElements] insertObjects:rows atIndexes:indexSet]; [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] + [rows count])]]; } - (void) removeRowsAtIndexPath : (NSUInteger) numRows : (NSIndexPath*) indexPath { NSIndexSet *indexSet = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange([indexPath row] + 1, numRows)]; [[self currentElements] removeObjectsAtIndexes:indexSet]; [[self currentStructure] replaceObjectAtIndex:[indexPath section] withObject:[NSNumber numberWithInt:([[[self currentStructure] objectAtIndex:[indexPath section]] intValue] - numRows)]]; } //UITABLEVIEWCONTROLLER FUNCTIONS - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { NSString *title = @""; if([self currentHeaders] != nil) { title = [[self currentHeaders] objectAtIndex:section]; } return title; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [[[self currentStructure] objectAtIndex:section] intValue]; } - (const NSArray*)sectionIndexTitlesForTableView:(UITableView *)tableView { if(self.showIndexes) { return self.currentHeaders; } return nil; } - (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index { if(self.showIndexes) { return [self.currentHeaders indexOfObject:title]; } return 0; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; UITableViewCell *cell = [[self tableView] cellForRowAtIndexPath:indexPath]; NSString *cellName = [[cell textLabel]text]; uint8_t offset = 0; if([indexPath section]) { for (int i = 0; i < [indexPath section]; i++) { offset += [[[self currentStructure] objectAtIndex:i] unsignedCharValue]; } } //Cells in MENU if([self currentNavLevel] == MENU) { if([cellName isEqualToString:NSLocalizedString(@"Maintenance", nil)]) { if(self.sentCommand == NONE) { NSLog(@"[MenuTableViewController.m]: Changing to navLevel: MAINTENANCE"); [[self protocol] readSensorData]; [self setSentCommand:A4]; [self startTimeoutTimer]; } } else if([cellName isEqualToString:NSLocalizedString(@"Basic Configuration", nil)]) { NSLog(@"[MenuTableViewController.m]: Changing to navLevel: BASIC_CONFIGURATION"); [self changeNavLevel:BASIC_CONFIGURATION:TRUE]; } } //Cells in MAINTENANCE else if([self currentNavLevel] == MAINTENANCE) { if([cellName isEqualToString:NSLocalizedString(@"Channels Present", nil)] || [cellName isEqualToString:NSLocalizedString(@"Product Present in Channel", nil)] || [cellName isEqualToString:NSLocalizedString(@"Channel Engine Status", nil)] || [cellName isEqualToString:NSLocalizedString(@"Money Collected", nil)] || [cellName isEqualToString:NSLocalizedString(@"Money Returned", nil)] || [cellName isEqualToString:NSLocalizedString(@"Products Sold", nil)] || [cellName isEqualToString:NSLocalizedString(@"Change Available", nil)]) { [self toggleDropList:indexPath]; } else if([cellName isEqualToString:NSLocalizedString(@"Sales log", nil)]) { if(self.sentCommand == NONE) { [self setRequestedLog:SALES_LOG]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad_Landscape" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } else { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } } else { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_Landscape" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } else { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } } } } else if([cellName isEqualToString:NSLocalizedString(@"Incident log", nil)]) { if(self.sentCommand == NONE) { [self setRequestedLog:INCIDENT_LOG]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad_Landscape" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } else { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_iPad" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } } else { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController_Landscape" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } else { self.dateRangePickerViewController = [[DateRangePickerViewController alloc] initWithNibName:@"DateRangePickerViewController" bundle:nil]; self.dateRangePickerViewController.delegate = self; self.dateRangePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.dateRangePickerViewController atIndex:self.childViewControllers.count]; [self.dateRangePickerViewController showInView:self.navigationController.view animated:YES]; } } } } else if([cellName isEqualToString:NSLocalizedString(@"Send report", nil)]) { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:[NSDate date]]; NSString *date = [NSString stringWithFormat:@"%02d/%02d/%d %02d:%02d:%02d",[components day],[components month],[components year],[components hour],[components minute],[components second]]; [self sendMaintenanceReport: [[self sensorStatus] response] : date: [self machineMACAddr]]; } } //Cells in BASIC_CONFIGURATION else if([self currentNavLevel] == BASIC_CONFIGURATION) { //Update Date & Time command if([cellName isEqualToString:NSLocalizedString(@"Update Date & Time", nil)]) { if(self.sentCommand == NONE) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_iPad_Landscape" bundle:nil]; self.datePickerViewController.delegate = self; self.datePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count]; [self.datePickerViewController showInView:self.navigationController.view animated:YES]; } else { self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_iPad" bundle:nil]; self.datePickerViewController.delegate = self; self.datePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count]; [self.datePickerViewController showInView:self.navigationController.view animated:YES]; } } else { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController" bundle:nil]; self.datePickerViewController.delegate = self; self.datePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count]; [self.datePickerViewController showInView:self.navigationController.view animated:YES]; } else { self.datePickerViewController = [[DatePickerViewController alloc] initWithNibName:@"DatePickerViewController_Landscape" bundle:nil]; self.datePickerViewController.delegate = self; self.datePickerViewController.childDelegate = self; [self.childViewControllers insertObject:self.datePickerViewController atIndex:self.childViewControllers.count]; [self.datePickerViewController showInView:self.navigationController.view animated:YES]; } } } } //Update Product Price command else if([cellName isEqualToString:NSLocalizedString(@"Update product price", nil)]) { if(self.sentCommand == NONE) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_iPad_Landscape" bundle:nil]; self.priceChangerViewController.delegate = self; self.priceChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count]; [self.priceChangerViewController showInView:self.navigationController.view animated:YES]; } else { self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_iPad" bundle:nil]; self.priceChangerViewController.delegate = self; self.priceChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count]; [self.priceChangerViewController showInView:self.navigationController.view animated:YES]; } } else { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController" bundle:nil]; self.priceChangerViewController.delegate = self; self.priceChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count]; [self.priceChangerViewController showInView:self.navigationController.view animated:YES]; } else { self.priceChangerViewController = [[PriceChangerViewController alloc] initWithNibName:@"PriceChangerViewController_Landscape" bundle:nil]; self.priceChangerViewController.delegate = self; self.priceChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.priceChangerViewController atIndex:self.childViewControllers.count]; [self.priceChangerViewController showInView:self.navigationController.view animated:YES]; } } } } //Update Product Name command else if([cellName isEqualToString:NSLocalizedString(@"Update product name", nil)]) { if(self.sentCommand == NONE) { if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_iPad_Landscape" bundle:nil]; self.nameChangerViewController.delegate = self; self.nameChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count]; [self.nameChangerViewController showInView:self.navigationController.view animated:YES]; } else { self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_iPad" bundle:nil]; self.nameChangerViewController.delegate = self; self.nameChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count]; [self.nameChangerViewController showInView:self.navigationController.view animated:YES]; } } else { if(UIDeviceOrientationIsLandscape([[UIDevice currentDevice] orientation])) { self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController_Landscape" bundle:nil]; self.nameChangerViewController.delegate = self; self.nameChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count]; [self.nameChangerViewController showInView:self.navigationController.view animated:YES]; } else { self.nameChangerViewController = [[NameChangerViewController alloc] initWithNibName:@"NameChangerViewController" bundle:nil]; self.nameChangerViewController.delegate = self; self.nameChangerViewController.childDelegate = self; [self.childViewControllers insertObject:self.nameChangerViewController atIndex:self.childViewControllers.count]; [self.nameChangerViewController showInView:self.navigationController.view animated:YES]; } } } } } else if([self currentNavLevel] == SALE_LIST) { if([self generateSaleNavLevel: [indexPath row] + offset]) { [self changeNavLevel:SALE:TRUE]; } } else if([self currentNavLevel] == SALE) { if([cellName isEqualToString:NSLocalizedString(@"Money Paid", nil)] || [cellName isEqualToString:NSLocalizedString(@"Money Returned", nil)]) { [self toggleDropList:indexPath]; } } else if([self currentNavLevel] == INCIDENT_LIST) { if([self generateIncidentNavLevel: [indexPath row] + offset]) { [self changeNavLevel:INCIDENT:TRUE]; } } } #pragma mark - Table view data source -(NSInteger)tableView: (UITableView *)tableView indentationLevelForRowAtIndexPath: (NSIndexPath *)indexPath { NSInteger indent = 0; if([[[self currentElements] objectAtIndex:indexPath.row] characterAtIndex:0] == '*') { indent++; } return indent; } - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return [[self currentStructure] count]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { Boolean needsIndent = FALSE; Boolean foldedList = FALSE; Boolean unfoldedList = FALSE; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self currentCellIdentifier] forIndexPath:indexPath]; //INSTANTIATE CELL IF NEEDED if (cell == nil) { if([self currentNavLevel] == MAINTENANCE) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[self currentCellIdentifier]]; } else { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self currentCellIdentifier]]; } } //CALCULATE TRUE ROW TO RETRIEVE NAME uint8_t offset = 0; if([indexPath section] ) { for (int i = 0; i < [indexPath section]; i++) { offset += [[[self currentStructure] objectAtIndex:i] unsignedCharValue]; } } //RETRIEVE NAME NSMutableString *cellText = [NSMutableString stringWithString:[[self currentElements] objectAtIndex:[indexPath row]+offset]]; //SET INDENT [cell setIndentationWidth:10]; //PARSE AND REMOVE CELL MODIFIER if([cellText characterAtIndex:0] == '>') { foldedList = TRUE; [cellText setString:[cellText substringFromIndex:1]]; } else if([cellText characterAtIndex:0] == 'v') { unfoldedList = TRUE; [cellText setString:[cellText substringFromIndex:1]]; } else if([cellText characterAtIndex:0] == '*') { needsIndent = TRUE; [cellText setString:[cellText substringFromIndex:1]]; } //PARSE AND REMOVE TAG NSInteger lastPos = [cellText rangeOfString:@"]"].location; NSInteger cellTag = [[cellText substringWithRange:NSMakeRange(1,lastPos-1)] intValue]; [cell setTag:cellTag]; [cellText setString:[cellText substringFromIndex:lastPos+1]]; //SET FINAL TEXT [[cell textLabel] setText:NSLocalizedString(cellText,nil)]; //MAINTENANCE CELLS if([self currentNavLevel] == MAINTENANCE) { [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview]; [[cell detailTextLabel] setText:@""]; [cell setAccessoryView:nil]; [cell setAccessoryType:UITableViewCellAccessoryNone]; if(foldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } else if(unfoldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat-open.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channels Present",nil)]) { [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",[[self sensorStatus] numChannels]]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Present in Channel",nil)]) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; for(int i = 0; i < [[self sensorStatus] numChannels]; i++) { if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:i] intValue] != 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; break; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channel Engine Status",nil)]) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; for(int i = 0; i < [[self sensorStatus] numChannels]; i++) { if([[[[self sensorStatus] channelStatus] objectAtIndex:i] intValue] != 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; break; } } } else if([[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"%@ (\\d+)",NSLocalizedString(@"Channel",nil)] options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0) { NSUInteger index = [[[[cell textLabel] text] substringFromIndex:([NSLocalizedString(@"Channel",nil) length] + 1)] intValue] - 1; if([cell tag] == 2001) // Products Present in Channel tag { if([[[[self sensorStatus] channelProductAvailability] objectAtIndex:index] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } else if([cell tag] == 2002) // Channel engine status tag { if([[[[self sensorStatus] channelStatus] objectAtIndex:index] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Door Sensor",nil)]) { if([[self sensorStatus] doorOpen]) { [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } else { [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Coil Sensor",nil)]) { if([[self sensorStatus] coilOpen]) { [[cell detailTextLabel] setText:NSLocalizedString(@"OPEN",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } else { [[cell detailTextLabel] setText:NSLocalizedString(@"CLOSED",nil)]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Collected",nil)]) { double numCollected = 0; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:0] intValue] * 20; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:1] intValue] * 10; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:2] intValue] * 5; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:3] intValue] * 2; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:4] intValue] * 1; numCollected += [[[[self sensorStatus] moneyCollected] objectAtIndex:5] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numCollected]]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Returned",nil)]) { double numReturned = 0; numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:0] intValue] * 2; numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:1] intValue] * 1; numReturned += [[[[self sensorStatus] moneyReturned] objectAtIndex:2] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numReturned]]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Products Sold",nil)]) { NSInteger numSold = 0; for(int i = 0; i < MAX_PRODUCTS; i++) { numSold += [[[[self sensorStatus] productsSold] objectAtIndex:i] intValue]; } [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%d",numSold]]; } else if([[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"%@ (\\d+)",NSLocalizedString(@"Product",nil)] options:0 error:NULL] numberOfMatchesInString:[[cell textLabel] text] options:0 range:(NSMakeRange(0,[[[cell textLabel] text] length]))] != 0) { NSUInteger index = [[[[cell textLabel] text] substringFromIndex:([NSLocalizedString(@"Product",nil) length] + 1)] intValue] - 1; if([cell tag] == 2007) { [[cell detailTextLabel] setText:[[[[self sensorStatus] productsSold] objectAtIndex:index] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Change Available",nil)]) { [[cell detailTextLabel] setText:@""]; [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; for(int i = 0; i < CHANGE_NUM_UNITS; i++) { if([[[[self sensorStatus] changeAvailable] objectAtIndex:i] intValue] != 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; break; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"20€ Notes",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"10€ Notes",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:1] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"5€ Notes",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:2] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"2€ Coins",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:3] stringValue]]; } else if([cell tag] == 2006) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"1€ Coins",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:4] stringValue]]; } else if([cell tag] == 2006) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:1] stringValue]]; } else if([cell tag] == 2008) { if([[[[self sensorStatus] changeAvailable] objectAtIndex:0] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"50c Coins",nil)]) { if([cell tag] == 2005) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyCollected] objectAtIndex:5] stringValue]]; } else if([cell tag] == 2006) { [[cell detailTextLabel] setText:[[[[self sensorStatus] moneyReturned] objectAtIndex:2] stringValue]]; } else if([cell tag] == 2008) { if([[[[self sensorStatus] changeAvailable] objectAtIndex:1] intValue] == 1) { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]]; } else { [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]]; } } } else 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)]) { [[cell detailTextLabel] setText:@""]; [cell setAccessoryView:nil]; [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator]; } } else if([self currentNavLevel] == SALE) { [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview]; [[cell detailTextLabel] setText:@""]; [cell setAccessoryView:nil]; [cell setAccessoryType:UITableViewCellAccessoryNone]; if(foldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } else if(unfoldedList) { NSInteger cellHeight = cell.contentView.frame.size.height; UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0,cellHeight/2 - (11/2),11,11)]; imageView.image = [UIImage imageNamed:@"carat-open.png"]; imageView.tag = CELL_CARAT_TAG; [cell.contentView addSubview:imageView]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Paid",nil)]) { double numCollected = 0; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:0] intValue] * 20; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:1] intValue] * 10; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:2] intValue] * 5; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:3] intValue] * 2; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:4] intValue] * 1; numCollected += [[[[self currentSale] moneyPaid] objectAtIndex:5] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numCollected]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Channel",nil)]) { [[cell detailTextLabel] setText:[[self currentSale] channel]]; [cell setAccessoryView:nil]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Code",nil)]) { [[cell detailTextLabel] setText:[[self currentSale] productCode]]; [cell setAccessoryView:nil]; } if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Product Price",nil)]) { [[cell detailTextLabel] setText:[[self currentSale] normalPrice]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Money Returned",nil)]) { double numReturned = 0; numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:0] intValue] * 2; numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:1] intValue] * 1; numReturned += [[[[self currentSale] moneyReturned] objectAtIndex:2] intValue] * 0.50; [[cell detailTextLabel] setText:[NSString stringWithFormat:@"%.2f",numReturned]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"20€ Notes",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"10€ Notes",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:1] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"5€ Notes",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:2] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"2€ Coins",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:3] stringValue]]; } else if([cell tag] == 3004) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:0] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"1€ Coins",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid] objectAtIndex:4] stringValue]]; } else if([cell tag] == 3004) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:1] stringValue]]; } } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"50c Coins",nil)]) { if([cell tag] == 3000) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyPaid]objectAtIndex:5] stringValue]]; } else if([cell tag] == 3004) { [[cell detailTextLabel] setText:[[[[self currentSale] moneyReturned] objectAtIndex:2] stringValue]]; } } } else if([self currentNavLevel] == INCIDENT) { [[[cell contentView] viewWithTag:CELL_CARAT_TAG] removeFromSuperview]; [[cell detailTextLabel] setText:@""]; [cell setAccessoryView:nil]; [cell setAccessoryType:UITableViewCellAccessoryNone]; if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Error Code",nil)]) { [[cell detailTextLabel] setText:[self.currentIncident errorCode]]; [cell setAccessoryView:nil]; } else if([[[cell textLabel] text] isEqualToString:NSLocalizedString(@"Error Value",nil)]) { [[cell detailTextLabel] setText:[self.currentIncident errorValue]]; [cell setAccessoryView:nil]; } } return cell; } //DELEGATE FUNCTIONS - (void)passDateViewController:(DatePickerViewController *)controller didFinishEnteringItem:(NSDate *)date { NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *components = [calendar components:units fromDate:date]; [_protocol updateTime: components]; [self setSentCommand:A5]; [self startTimeoutTimer]; } - (void)passPriceViewController:(PriceChangerViewController *)controller didFinishEnteringItem:(NSArray *)data { //Channel,Code,Price NSString *channelString = [data objectAtIndex:0]; NSString *codeString = [data objectAtIndex:1]; NSString *priceString = [data objectAtIndex:2]; if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"^\\d+(\\.\\d+)?$"] options:0 error:NULL] numberOfMatchesInString:priceString options:0 range:NSMakeRange(0,[priceString length])]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered price has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else if([channelString length] == 0) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing channel",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else if([codeString length] == 0) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing product code",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:channelString options:0 range:NSMakeRange(0,[channelString length])]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered channel has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:codeString options:0 range:NSMakeRange(0,[codeString length])]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered product code has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else { int channel = [channelString intValue]; int code = [codeString intValue]; NSArray *price = [priceString componentsSeparatedByString:@"."]; [_protocol updatePrice:channel :code :[[price objectAtIndex:0] intValue] :[[price objectAtIndex:1] intValue]]; [self setSentCommand:A6]; [self startTimeoutTimer]; } } - (void)passNameViewController:(PriceChangerViewController *)controller didFinishEnteringItem:(NSArray *)data { //Channel,Code,Name NSString *channelString = [data objectAtIndex:0]; NSString *codeString = [data objectAtIndex:1]; NSString *name = [data objectAtIndex:2]; if([channelString length] == 0) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing channel",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else if([codeString length] == 0) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Missing product code",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:channelString options:0 range:NSMakeRange(0,[channelString length])]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered channel has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else if(![[NSRegularExpression regularExpressionWithPattern:[NSString stringWithFormat:@"\\d+"] options:0 error:NULL] numberOfMatchesInString:codeString options:0 range:NSMakeRange(0,[codeString length])]) { UIAlertView* alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Error",nil) message:NSLocalizedString(@"Entered product code has an invalid format",nil) delegate:nil cancelButtonTitle:NSLocalizedString(@"OK",nil) otherButtonTitles:nil]; [alert show]; } else { int channel = [channelString intValue]; int code = [codeString intValue]; [_protocol updateProductName:channel :code :name]; [self setSentCommand:A7]; [self startTimeoutTimer]; } } - (void) passDateRangeViewController:(DateRangePickerViewController*)controller didFinishEnteringItem:(NSDate*) from : (NSDate*) to { [NSThread sleepForTimeInterval:1]; //HACK! if([self requestedLog] == SALES_LOG) { NSLog(@"[MenuTableViewController.m]: Changing to navLevel: SALE_LIST"); NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *componentsFrom = nil; NSDateComponents *componentsTo = nil; if(from != nil) { componentsFrom = [calendar components:units fromDate:from]; } if(to != nil) { componentsTo = [calendar components:units fromDate:to]; } [_protocol readSalesLog: componentsFrom : componentsTo]; [self setSentCommand:A2]; [self startTimeoutTimer]; } else if([self requestedLog] == INCIDENT_LOG) { NSLog(@"[MenuTableViewController.m]: Changing to navLevel: INCIDENT_LIST"); NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSCalendarUnit units = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit; NSDateComponents *componentsFrom = nil; NSDateComponents *componentsTo = nil; if(from != nil) { componentsFrom = [calendar components:units fromDate:from]; } if(to != nil) { componentsTo = [calendar components:units fromDate:to]; } [_protocol readIncidentLog: componentsFrom : componentsTo]; [self setSentCommand:A3]; [self startTimeoutTimer]; } } @end