SettingsController.m 10.3キロバイト
//
//  SettingsController.m
//  jacketparentweb
//
//  Created by Chris Johnston on 11/28/16.
//  Copyright © 2016 ドラッサル 亜嵐. All rights reserved.
//

#import "SettingsController.h"
#import "InputMotorController.h"
#import "InputSoundController.h"
#import "FirmwareDownloadController.h"
#import "FirmwareUpdateController.h"
#import "EepromController.h"
#import "BootSettingController.h"

@interface SettingsController ()

@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (strong, nonatomic) IBOutlet UILabel *currentMotor;

@property (nonatomic) NSInteger itemCounter;
@property (nonatomic) NSTimer * tmr;

@end

@implementation SettingsController {
    UIView *_mask;
    NSTimer *_writeWalkResponseTimer;
    NSTimer *_writeResetTimerResponseTimer;
    bool ignoreWriteWalkResponse;
    bool ignoreWriteResetUsetimeResponse;
    NSArray<UILabel*>* timeRangeLabels;
    NSMutableArray<NSString*>* timeRangeData;
    NSArray<NSString*>* daysOfWeek;
}
@synthesize ble;
@synthesize protocol;

+ (void)show:(BleProtocol*)protocol navigationController:(UINavigationController*)navigationController {
    SettingsController *viewObj=[[SettingsController alloc] initWithNibName:@"SettingsController" bundle:nil];
    viewObj.protocol = protocol;
    [navigationController pushViewController:viewObj  animated:YES];
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    
    _lastProtocolDelegate = protocol.delegate;
    protocol.delegate = self;

    bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_ID;
    [self bleCommandTask];
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [self.tmr invalidate];
    protocol.delegate = _lastProtocolDelegate;
}

- (void)dealloc {
    // Do cleanup
}

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

- (void)writeResetTimerResponseTimeout:(NSTimer *)timer {
    ignoreWriteResetUsetimeResponse = true;
    [self showAlert:@"ジャケットの設定" message:@"設定が保存されない。"];
}

- (NSString*)byteToDays:(NSString*)dowByte{
    NSMutableString *result = [NSMutableString stringWithString:@""];
    const char *chars = [dowByte UTF8String];
    Byte byte = strtoul(chars, NULL, 16);
    for(int i=0; i<7; i++){
        if(byte & (1 << i)) {
            [result appendString:[daysOfWeek objectAtIndex:i]];
        }
    }
    return [NSString stringWithString:result];
}

- (void)showAlert:(NSString*)title message:(NSString*)message{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title
                                                    message:message
                                                   delegate:self
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
    [alert show];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    [_mask removeFromSuperview];
}

- (void)showMask {
    _mask = [[UIView alloc] initWithFrame:[self.view frame]];
    [_mask setBackgroundColor:[UIColor colorWithWhite:0.0 alpha:0.25]];
    [self.view addSubview:_mask];
}

- (IBAction)firmwareDownloadClicked:(id)sender {
    FirmwareDownloadController *viewObj=[[FirmwareDownloadController alloc] initWithNibName:@"FirmwareDownloadController" bundle:nil];
    viewObj.protocol = self.protocol;
    [self presentViewController:viewObj animated:YES completion: nil];
}

- (IBAction)firmwareUpdateClicked:(id)sender {
    FirmwareUpdateController *viewObj=[[FirmwareUpdateController alloc] initWithNibName:@"FirmwareUpdateController" bundle:nil];
    viewObj.protocol = self.protocol;
    [self presentViewController:viewObj animated:YES completion: nil];
}

- (IBAction)eepromUpdateClicked:(id)sender {
    EepromController *viewObj=[[EepromController alloc] initWithNibName:@"EepromController" bundle:nil];
    viewObj.protocol = self.protocol;
    [self presentViewController:viewObj animated:YES completion: nil];
}

- (IBAction)bootUpdateClicked:(id)sender {
    BootSettingController *viewObj=[[BootSettingController alloc] initWithNibName:@"BootSettingController" bundle:nil];
    viewObj.protocol = self.protocol;
    [self presentViewController:viewObj animated:YES completion: nil];
}

- (IBAction)InputMotorClicked:(id)sender {
    InputMotorController *viewObj=[[InputMotorController alloc] initWithNibName:@"InputMotorController" bundle:nil];
    viewObj.protocol = self.protocol;
    [self presentViewController:viewObj animated:YES completion: nil];
}

- (IBAction)InputSoundClicked:(id)sender {
    InputSoundController *viewObj=[[InputSoundController alloc] initWithNibName:@"InputSoundController" bundle:nil];
    viewObj.protocol = self.protocol;
    [self presentViewController:viewObj animated:YES completion: nil];
}

- (IBAction)resetClicked:(id)sender {
    [[self protocol]putData:@"systemReset" data:nil];
}

- (IBAction)updateModeResetClicked:(id)sender {
    [[self protocol]putData:@"eepromWriteProtect" data:@"0"];
}

- (BOOL)bleCommandTask {
    switch(bleCommandState) {
        case SETTINGS_CONTROLLER__EEPROM_READ_MODE:
            [[self protocol]putData:@"infoDeviceId" data:nil];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_ID:
            [[self protocol]putData:@"infoDeviceId" data:nil];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_MODEL:
            [[self protocol]putData:@"infoDeviceModel" data:nil];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_TYPE:
            [[self protocol]putData:@"infoDeviceType" data:nil];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_OS:
            [[self protocol]putData:@"infoDeviceOs" data:nil];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_PIN:
            [[self protocol]putData:@"infoDevicePin" data:nil];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_MODE_DONE:
            bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_ID;
            [self bleCommandTask];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_ID_DONE:
            bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_MODEL;
            [self bleCommandTask];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_MODEL_DONE:
            bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_TYPE;
            [self bleCommandTask];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_TYPE_DONE:
            bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_OS;
            [self bleCommandTask];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_OS_DONE:
            bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_PIN;
            [self bleCommandTask];
            break;
        case SETTINGS_CONTROLLER__EEPROM_READ_PIN_DONE:
            bleCommandState = SETTINGS_CONTROLLER__DONE;
            [self bleCommandTask];
            break;
        case SETTINGS_CONTROLLER__DONE:
        {
            NSLog(@"Ble command set done!");
            break;
        }
    }
    return false;
}

- (void)protocolDidGetData:(NSString *)dataType data:(NSString *)dataData {
    NSString *dataTypeFixed;
    
    if([dataType hasPrefix:@"read"]) {
        dataTypeFixed = [NSString stringWithFormat:@"%@%@",[[dataType substringWithRange:NSMakeRange(4, 1)] lowercaseString], [dataType substringFromIndex:5]];
        
        //NSLog(@"[SettingsController] read dataTypeFixed: %@", dataTypeFixed);
        
        if([dataData isEqualToString:@""]) {
            dataData = @"なし";
        }
        
        if([dataTypeFixed isEqualToString:@"motor"]) {
            _currentMotor.text = dataData;
        }
        
        //NSLog(@"[SettingsController] read dataData: %@", dataData);
    } else if([dataType hasPrefix:@"write"]) {
        dataTypeFixed = [NSString stringWithFormat:@"%@%@",[[dataType substringWithRange:NSMakeRange(5, 1)] lowercaseString], [dataType substringFromIndex:6]];
        //NSLog(@"[SettingsController] write dataTypeFixed: %@", dataTypeFixed);
        //NSLog(@"[SettingsController] write dataData: %@", dataData);
        
        if([dataTypeFixed isEqual:@"walking"]) {
            if(ignoreWriteWalkResponse) return;
            [_writeWalkResponseTimer invalidate];
            
            if([dataData isEqual:@"OK"]) {
                [self showAlert:@"ジャケットの設定" message:@"設定が保存されました。"];
            } else {
                [self showAlert:@"ジャケットの設定" message:@"設定が保存されない。"];
            }
        }
    } else if([dataType isEqualToString:@"eepromWriteProtect"]) {
        [[self protocol]putData:@"systemResetInBootloader" data:nil];
    } else if([dataType isEqualToString:@"infoDeviceMode"]) {
        NSLog(@"infoDeviceMode");
        lblDeviceMode.text = dataData;
        bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_MODE_DONE;
        [self bleCommandTask];
    } else if([dataType isEqualToString:@"infoDeviceId"]) {
        NSLog(@"infoDeviceId");
        lblDeviceId.text = dataData;
        bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_ID_DONE;
        [self bleCommandTask];
    } else if([dataType isEqualToString:@"infoDeviceModel"]) {
        NSLog(@"infoDeviceModel");
        lblDeviceModel.text = dataData;
        bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_MODEL_DONE;
        [self bleCommandTask];
    } else if([dataType isEqualToString:@"infoDeviceType"]) {
        NSLog(@"infoDeviceType");
        lblDeviceType.text = dataData;
        bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_TYPE_DONE;
        [self bleCommandTask];
    } else if([dataType isEqualToString:@"infoDeviceOs"]) {
        NSLog(@"infoDeviceOs");
        lblDeviceOs.text = dataData;
        if([dataData hasPrefix:@"B"]) {
            lblDeviceMode.text = @"UPDATE";
        } else {
            lblDeviceMode.text = @"APPLICATION";
        }
        bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_OS_DONE;
        [self bleCommandTask];
    } else if([dataType isEqualToString:@"infoDevicePin"]) {
        NSLog(@"infoDevicePin");
        lblDevicePin.text = dataData;
        bleCommandState = SETTINGS_CONTROLLER__EEPROM_READ_PIN_DONE;
        [self bleCommandTask];
    }
}

@end