// // 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