MenuTableViewController.m 13.6 KB
//
//  MenuTableViewController.m
//  DUREX Vendor Control
//
//  Created by Imanol Barba on 5/23/14.
//  Copyright (c) 2014 Emmoco. All rights reserved.
//

#import "MenuTableViewController.h"
#import "DUREXAppDelegate.h"

@interface MenuTableViewController ()
{
    IBOutlet UIActivityIndicatorView *_activityIndicator;
    NSTimer *_writeTimer;
}
@property (nonatomic,strong) const NSArray *menuElements;
@property (nonatomic,strong) const NSArray *menuStructure;
@property (nonatomic,strong) const NSArray *menuHeaders;

@property (nonatomic,strong) const NSArray *maintenanceElements;
@property (nonatomic,strong) const NSArray *maintenanceStructure;
@property (nonatomic,strong) const NSArray *maintenanceHeaders;

@property (nonatomic,strong) const NSArray *salesElements;
@property (nonatomic,strong) const NSArray *salesStructure;
@property (nonatomic,strong) const NSArray *salesHeaders;

@property (nonatomic,strong) const NSArray *configElements;
@property (nonatomic,strong) const NSArray *configStructure;
@property (nonatomic,strong) const NSArray *configHeaders;

@property (nonatomic,strong) const NSArray *cellIdentifiers;

@property (nonatomic,strong) CommunicationProtocol* protocol;
@property uint8_t currentNavLevel;
@property NSString *currentCellIdentifier;
@property const NSArray *currentElements;
@property const NSArray *currentStructure;
@property const NSArray *currentHeaders;

@end

@implementation MenuTableViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self)
    {
        // Custom initialization
    }
    return self;
}

- (void) initializeMenuEntries
{
    [self setMenuElements:[[NSArray alloc] initWithObjects:MENU_ELEMENTS, nil]];
    [self setMenuStructure:[[NSArray alloc] initWithObjects:MENU_CELLS_PER_SECTION, nil]];
    if([[self menuStructure] count] > 1)
    {
        [self setMenuHeaders:[[NSArray alloc] initWithObjects:MENU_HEADERS, nil]];
    }
    else
    {
        [self setMenuHeaders:nil];
    }
    
    [self setMaintenanceElements:[[NSArray alloc] initWithObjects:MAINTENANCE_ELEMENTS, nil]];
    [self setMaintenanceStructure:[[NSArray alloc] initWithObjects:MAINTENANCE_CELLS_PER_SECTION, nil]];
    if([[self maintenanceStructure] count] > 1)
    {
        [self setMaintenanceHeaders:[[NSArray alloc] initWithObjects:MAINTENANCE_HEADERS, nil]];
    }
    else
    {
        [self setMaintenanceHeaders:nil];
    }

    [self setSalesElements:[[NSArray alloc] initWithObjects:SALES_ELEMENTS, nil]];
    [self setSalesStructure:[[NSArray alloc] initWithObjects:SALES_CELLS_PER_SECTION, nil]];
    if([[self salesStructure] count] > 1)
    {
        [self setSalesHeaders:[[NSArray alloc] initWithObjects:SALES_HEADERS, nil]];
    }
    else
    {
        [self setSalesHeaders:nil];
    }
    
    [self setConfigElements:[[NSArray alloc] initWithObjects:CONFIGURATION_ELEMENTS, nil]];
    [self setConfigStructure:[[NSArray alloc] initWithObjects:CONFIGURATION_CELLS_PER_SECTION, nil]];
    if([[self configStructure] count] > 1)
    {
        [self setConfigHeaders:[[NSArray alloc] initWithObjects:CONFIGURATION_HEADERS, nil]];
    }
    else
    {
        [self setConfigHeaders:nil];
    }
    
    [self setCellIdentifiers:[[NSArray alloc] initWithObjects:CELL_IDENTIFIERS, nil]];
}

- (void) changeNavLevel: (uint8_t) level : (BOOL) push
{
    NSLog(@"[MenuTableViewController.m]: navLevel is %d",level);
    if(push)
    {
        [[self parentLayout] push: [NSNumber numberWithUnsignedChar:self.currentNavLevel]];
    }
    [self setCurrentNavLevel:level];
    [self setCurrentCellIdentifier:[[self cellIdentifiers] objectAtIndex:[self currentNavLevel]]];
    if([self currentNavLevel] == MENU)
    {
        [[self navigationItem] setTitle:NSLocalizedString(@"PIECE OF CRAP 2000 PRO ULTRA", nil)];
        [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] == SALES)
    {
        [[self navigationItem] setTitle:NSLocalizedString(@"Sales log", nil)];
        [self setCurrentElements:[self salesElements]];
        [self setCurrentStructure:[self salesStructure]];
        [self setCurrentHeaders:[self salesHeaders]];
    }
    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 tableView] reloadData];
    NSRange range = NSMakeRange(0, [self numberOfSectionsInTableView:[self tableView]]);
    NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range];
    [[self tableView] reloadSections:sections withRowAnimation:UITableViewRowAnimationAutomatic];
}

- (void) navBack
{
    NSNumber *prevLevel = [[self parentLayout] pop];
    self.currentNavLevel = prevLevel.intValue;
    [self changeNavLevel: prevLevel.intValue : FALSE];
}
             
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString *title = @"";
    if([self currentHeaders] != nil)
    {
        title = [[self currentHeaders] objectAtIndex:section];
    }
    return title;
}

- (void) backButtonPressed: (id) sender
{
    NSLog(@"[MenuTableViewController.m]: Navigation Stack has %d remaining levels",[[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");
        [self.navigationController popViewControllerAnimated:YES];
    }
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    [_activityIndicator setHidden:YES];
    
    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 setBackgroundImage: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];
    
    //DUREX protocol initialization
    [_protocol setMessageAvailable:false];
    if(![_protocol establishConnection])
    {
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Communication error" message:@"Error while trying to connect to the device." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        UIViewController *previous = [[[self navigationController] viewControllers] objectAtIndex:[[[self navigationController] viewControllers] count]-2];
        [[self navigationController] popToViewController:previous animated:YES];
    }
    
    //Initialize parentLayout stack
    [self setParentLayout:[[Stack alloc]init]];
    
    //Set navigation level
    [self initializeMenuEntries];
    self.currentNavLevel = 255;
    [self changeNavLevel:MENU:FALSE];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;
    
    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

-(void)didReceiveNotification:(NSNotification*) notification
{
    
}

-(void)dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"[MenuTableViewController.m]: Section: %d Row: %d",[indexPath section],[indexPath row]);
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    NSString *cellName = [[[[self tableView] cellForRowAtIndexPath:indexPath]textLabel]text];
    if([cellName isEqualToString:NSLocalizedString(@"Maintenance", nil)] && [self currentNavLevel] == MENU)
    {
        NSLog(@"[MenuTableViewController.m]: Changing to navLevel: MAINTENANCE");
        [self changeNavLevel:MAINTENANCE:TRUE];
    }
    else if([cellName isEqualToString:NSLocalizedString(@"Sales log", nil)] && [self currentNavLevel] == MAINTENANCE)
    {
        NSLog(@"[MenuTableViewController.m]: Changing to navLevel: SALES");
        [self changeNavLevel:SALES:TRUE];
    }
    else if([cellName isEqualToString:NSLocalizedString(@"Basic Configuration", nil)] && [self currentNavLevel] == MENU)
    {
        NSLog(@"[MenuTableViewController.m]: Changing to navLevel: BASIC_CONFIGURATION");
        [self changeNavLevel:BASIC_CONFIGURATION:TRUE];
    }

}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self currentStructure] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [[[self currentStructure]objectAtIndex:section] integerValue];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[self currentCellIdentifier] forIndexPath:indexPath];
    
    if (cell == nil)
    {
        NSLog(@"[MenuTableViewController.m]: Initializing cell");
        if([self currentNavLevel] == MAINTENANCE)
        {
             NSLog(@"[MenuTableViewController.m]: Dispatching Maintenance-type cell");
             cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:[self currentCellIdentifier]];
        }
        else
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self currentCellIdentifier]];
        }
    }
    uint8_t offset = 0;
    if([indexPath section] )
    {
        for (int i = 0; i < [indexPath section]; i++)
        {
            offset += [[[self currentStructure] objectAtIndex:i] unsignedCharValue];
        }
    }
    [[cell textLabel] setText:NSLocalizedString([[self currentElements] objectAtIndex:[indexPath row]+offset],nil)];
    if([self currentNavLevel] == MAINTENANCE)
    {
        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
        {
            [[cell detailTextLabel] setText:@"VALUE"];
            [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_checkmark"]]];
            if( [[[cell textLabel] text] isEqualToString:NSLocalizedString(@"CH4 presence",nil)])
            {
                [cell setAccessoryView: [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"icon_delete"]]];
            }

        }
    }
    else if([self currentNavLevel] == SALES)
    {
        
    }
    return cell;
}


/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/

/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }   
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end