OTAUpdateViewController.m 7.34 KB
//
//  OTAUpdateViewController.m
//  HDFwear
//
//  Created by admin on 2024/1/24.
//

#import "HDFwear-Bridging-Header.h"
#import "OTAUpdateViewController.h"
#import "OTAManager.h"
#import "MBProgressHUD.h"

@interface OTAUpdateViewController ()

@end

@implementation OTAUpdateViewController{
    NSDate *beginTime;
    
    BOOL isUpgrading;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    isUpgrading = NO;

    _buttonStart.layer.borderWidth = 1.0f;
    _buttonStart.layer.cornerRadius = 4.0f;
    _buttonStart.layer.masksToBounds = YES;
    _buttonPrepare.layer.borderWidth = 1.0f;
    _buttonPrepare.layer.cornerRadius = 4.0f;
    _buttonPrepare.layer.masksToBounds = YES;

    
    if (self.currentPeripheral) {
        _labelBluetoothState.text = @"已连接";
        [_buttonPrepare setEnabled:YES];
    } else {
        _labelBluetoothState.text = @"N/A";
        [_buttonPrepare setEnabled:NO];
        [_buttonStart setEnabled:NO];
    }

    NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    [nc addObserver:self
           selector:@selector(handleGlobalMessage:)
               name:kMsgPeripheralConnected
             object:nil];
    [nc addObserver:self
           selector:@selector(handleGlobalMessage:)
               name:kMsgPeripheralDisconnected
             object:nil];
    [nc addObserver:self
           selector:@selector(handleGlobalMessage:)
               name:kMsgOTAStatus
             object:nil];
    [nc addObserver:self
           selector:@selector(handleGlobalMessage:)
               name:kMsgAudioPackageRecevied
             object:nil];
    [nc addObserver:self
           selector:@selector(handleGlobalMessage:)
               name:kMsgAudioSpeedRecevied
             object:nil];
    [nc addObserver:self
           selector:@selector(handleGlobalMessage:)
               name:kMsgRemoteStatusRecevied
             object:nil];
    
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    if (self.closeBlock) {
        self.closeBlock();
    }
}

- (void)handleGlobalMessage:(NSNotification *)note{
    NSString* name = note.name;
    NSLog(@"nick_name:%@", name);
    NSDictionary* dict = note.userInfo;
    
    if ([name isEqualToString:kMsgPeripheralConnected]){
        if (self.currentPeripheral) {
            _labelBluetoothState.text = @"已连接";
            [_buttonPrepare setEnabled:YES];
            NSInteger mtu = [self.currentPeripheral maximumWriteValueLengthForType:CBCharacteristicWriteWithoutResponse];
            NSLog(@"mtu view:%d", mtu);
            [self.otaManager setMaxMtu:mtu];
        }
    } else if ([name isEqualToString:kMsgPeripheralDisconnected]){
        _labelBluetoothState.text = @"N/A";
        isUpgrading = NO;
        [_buttonPrepare setEnabled:NO];
        [_buttonStart setEnabled:NO];
        [_buttonStart setTitle:@"START" forState:UIControlStateNormal];
    } else if ([name isEqualToString:kMsgOTAStatus]){
        NSInteger state = ((NSNumber *)[dict objectForKey:@"status"]).integerValue;
        
        NSString *msg = @"UNKNOWN";
        switch (state) {
            case STATE_IDLE:
                msg = @"IDLE";
                break;
                
            case STATE_PREPARING:
                msg = @"PREPARING";
                break;
                
            case STATE_PREPARED:
                msg = @"PREPARED";
                break;
                
            case STATE_TRANSFERRING:
                msg = @"TRANSFERRING";
                beginTime = [NSDate date];
                NSLog(@"nick_time:%@", beginTime);
                break;
                
            case STATE_TRANSFERRED:
                msg = @"TRANSFERRED";
                isUpgrading = NO;
                [_buttonStart setEnabled:YES];
                [_buttonStart setTitle:@"START" forState:UIControlStateNormal];
                
                [self.otaManager confirmUpdateAndReboot];
                break;
                
            default:
                msg = @"UNKNOWN";
                isUpgrading = NO;
                [_buttonStart setEnabled:YES];
                [_buttonStart setTitle:@"START" forState:UIControlStateNormal];
                break;
        }
        
        NSLog(@"onStatus: %ld %@", state, msg);
        _labelBluetoothState.text = msg;
    } else if ([name isEqualToString:kMsgAudioPackageRecevied]) {
        NSInteger psn = ((NSNumber *)[dict objectForKey:@"psn"]).integerValue;
        NSData *data = [dict objectForKey:@"data"];
        NSLog(@"nick_speed");
        
    } else if ([name isEqualToString:kMsgRemoteStatusRecevied]) {
        RemoteStatus *status = [dict objectForKey:@"status"];

        [_buttonStart setEnabled:YES];
    } else if ([name isEqualToString:kMsgAudioSpeedRecevied]) {
        NSInteger writeByte = ((NSNumber *)[dict objectForKey:@"speed"]).integerValue;
        NSLog(@"writeByte is :%d", writeByte);
        NSDate *now = [[NSDate alloc] init];
        now = [NSDate date];
        NSDateComponents *compt = [[NSCalendar currentCalendar] components:NSCalendarUnitMinute| NSCalendarUnitSecond fromDate:beginTime   toDate:now  options:0];
        int min = compt.minute;
        int sec = compt.second;
        int time = min * 60 + sec;
        double speed = writeByte / time / 1000;
        NSLog(@"nick_now:%d", sec);
    }
}

- (NSString *)convertDataToHexStr:(NSData *)data {
    if (!data || [data length] == 0) {
        return @"";
    }
    
    NSMutableString *string = [[NSMutableString alloc] initWithCapacity:[data length]];
    [data enumerateByteRangesUsingBlock:^(const void *bytes, NSRange byteRange, BOOL *stop) {
        unsigned char *dataBytes = (unsigned char*)bytes;
        for (NSInteger i = 0; i < byteRange.length; i++) {
            NSString *hexStr = [NSString stringWithFormat:@"%x", (dataBytes[i]) & 0xff];
            if ([hexStr length] == 2) {
                [string appendString:hexStr];
            } else {
                [string appendFormat:@"0%@", hexStr];
            }
        }
    }];
    
    return string;
}

- (void)showTextHUD:(NSString *) text {
    dispatch_async(dispatch_get_main_queue(), ^{
        // 快速显示一个提示信息
        MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
        hud.label.text = text;
        
        hud.label.textColor = [UIColor whiteColor];
        hud.label.font = [UIFont systemFontOfSize:17.0];
        hud.userInteractionEnabled = NO;
        
        hud.mode = MBProgressHUDModeCustomView;
        hud.removeFromSuperViewOnHide = YES;
        [hud hideAnimated:YES afterDelay:1.5];
    });
}

- (IBAction)didButtonStartClicked:(UIButton *)sender {
    if (isUpgrading) {
        [self showTextHUD:@"正在升级中,请稍候!"];
        return;
    }
    [self.otaManager upgrade];
    isUpgrading = YES;
    [_buttonStart setEnabled:NO];
    [_buttonStart setTitle:@"UPGRADING" forState:UIControlStateNormal];
}

- (IBAction)didButtonPrepareClicked:(UIButton *)sender {
    if (isUpgrading) {
        [self showTextHUD:@"正在升级中,请稍候!"];
        return;
    }
    
    
    NSLog(@"OTA path: %@", self.path);
    
    isUpgrading = NO;
    [self.otaManager setOTAFile:self.path];
    
    NSString *version = [self.otaManager getOTAVersion];
    [_labelOTAVersion setText:version];
    
    [self.otaManager prepare];
}


@end