RTL8710AF_GCC/tools/simple_config_wizard/iOS/SimpleConfigWizard/SimpleConfig/ConfigViewController.m
ant 03e74a8e50 motify compile link error
motify compile link error
2016-09-18 09:03:25 +08:00

1035 lines
34 KiB
Objective-C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// ConfigViewController.m
// SimpleConfig
//
// Created by Realsil on 14/11/11.
// Copyright (c) 2014年 Realtek. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "ConfigViewController.h"
#import <SystemConfiguration/CaptiveNetwork.h>
#import "ClientViewController.h"
#define timeout_cfg 120
#define tag_table_confirm 2
#define cfg_basic_time 15
#define tag_timer 10101
#define tag_cfg_confirm 10601
#define tag_cfg_setNumber 10602
@implementation ConfigViewController
@synthesize m_input_ssid, m_input_password, m_input_pin, m_config_button, m_control_button, m_hide_ssid_switch;
@synthesize m_old_label, m_old_switch, m_old_time;
@synthesize simpleConfig;
@synthesize m_qrscan_line;
@synthesize waitingAlert,cfgProgressView;
@synthesize confirm_list;
NSString *PIN_cfg = nil, *QR_PIN=nil;
NSTimer *waitTimer;
NSTimer *m_timer;
unsigned int timerCount = 0;
int g_checkFinishWait_cfg = cfg_basic_time;
int g_config_device_num = 0;
int unconfirmIndex = -1;
NSMutableArray *config_deviceList; //context: dev_info(struct)
UIAlertController *cfg_alertController;
NSTimeInterval configTimerStart = 0;
- (void)viewDidLoad {
[super viewDidLoad];
confirm_list = nil;
self.tableDeviceList.tag = tag_table_confirm;
self.tableDeviceList.delegate = self;
self.tableDeviceList.dataSource = self;
// Do any additional setup after loading the view, typically from a nib.
[m_input_ssid setText:[self fetchCurrSSID]];
[m_input_ssid addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];
[m_input_ssid setEnabled:NO];
[m_input_password addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];
[m_input_pin addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];
[m_control_button setHidden:YES];
m_context.m_mode = MODE_INIT;
simpleConfig = [[SimpleConfig alloc] init];
BOOL hidden = false;
#if SC_CONFIG_QC_TEST
hidden = false;
#else
hidden = true;
#endif
[m_old_label setHidden:hidden];
[m_old_switch setHidden:hidden];
[m_old_switch setOn:YES];
[m_old_switch addTarget:self action:nil forControlEvents:UIControlEventValueChanged];
[m_old_time setHidden:hidden];
[m_old_time addTarget:self action:@selector(textFieldStartEditing:) forControlEvents:UIControlEventEditingDidBegin];
[m_old_time addTarget:self action:@selector(textFieldDoneEditing:) forControlEvents:UIControlEventEditingDidEndOnExit];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewDidDisappear:(BOOL)animated
{
// Must release simpleConfig, so that its asyncUDPSocket delegate won't receive data
NSLog(@"config viewDidDisappear");
#if 0
[simpleConfig rtk_sc_close_sock];
#else
[simpleConfig rtk_sc_close_sock];
#ifdef ARC
[simpleConfig dealloc];
#endif
simpleConfig = nil;
#endif
if ([waitTimer isValid]) {
[waitTimer invalidate];
waitTimer = nil;
}
[super viewDidDisappear:animated];
}
- (void)viewWillAppear:(BOOL)animated
{
#if 0
[simpleConfig rtk_sc_reopen_sock];
#else
if (simpleConfig==nil) {
simpleConfig = [[SimpleConfig alloc] init];
}
[m_control_button setHidden:true];
#endif
m_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(configTimerHandler:) userInfo:nil repeats:YES];
//NSLog(@"config view will appear");
}
- (void)dealloc {
#ifdef ARC
[m_input_ssid release];
[m_input_password release];
[m_input_pin release];
[m_config_button release];
[m_control_button release];
[config_deviceList release];
[simpleConfig dealloc];
[m_context.m_timer invalidate];
[m_context.m_timer release];
[m_old_time release];
[m_old_label release];
[m_old_switch release];
[m_hide_ssid_switch release];
[super dealloc];
#endif
}
#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.
if([segue.identifier isEqualToString:@"SegueController"])
{
ClientViewController *client_vc = segue.destinationViewController;
struct dev_info dev;
NSValue *dev_val = [simpleConfig.config_list objectAtIndex:unconfirmIndex];
[dev_val getValue:&dev];
client_vc.sharedData = [[NSValue alloc] initWithBytes:&dev objCType:@encode(struct dev_info)];
}
}
/* Hide the keyboard when pushing "enter" */
- (BOOL)textFieldDoneEditing:(UITextField *)sender
{
NSLog(@"textFieldDoneEditing, Sender is %@", sender);
UITextField *target = sender;
return [target resignFirstResponder];
}
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if([text isEqualToString:@"\n"])
{
[textView resignFirstResponder];
return NO;
}
return YES;
}
- (BOOL)textFieldStartEditing: (UITextField *)sender
{
if ([sender isEqual:m_old_time]) {
if (![m_old_switch isOn]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:SC_UI_ALERT_TITLE_WARNING message:SC_UI_ALERT_TEST_TURN_ON_SWITCH delegate:self cancelButtonTitle:SC_UI_ALERT_OK otherButtonTitles:nil, nil];
[alert show];
}
return YES;
}
return NO;
}
- (void)CheckConfigDeviceNumber
{
//alert picker uiview
UIActionSheet *cfgNumber_actionSheet = nil;
cfgNumber_actionSheet = [[UIActionSheet alloc]
initWithTitle:@"Configure New Device"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:
@"Add 1 device",
@"Add 2 devices",
@"Add 3 devices",
@"Add 4 devices",
@"Add 5 devices",
@"Add 6 devices",
@"Add 7 devices",
@"Add 8 devices", nil];
[cfgNumber_actionSheet showInView:self.view];
//[cfgNumber_actionSheet showFromRect:[(UIButton *)sender frame] inView:self.view animated:YES];
cfgNumber_actionSheet.tag = tag_cfg_setNumber;
}
/* action responder */
- (IBAction)rtk_start_listener:(id)sender
{
// do stuff for iOS 8 and newer
unconfirmIndex = -1;
cfg_alertController = [UIAlertController
alertControllerWithTitle:@"Input Device PIN code"
message:@"The PIN code will be display on device if the PIN code is exist.\nOtherwise, choose the skip option."
preferredStyle:UIAlertControllerStyleAlert];
[cfg_alertController addTextFieldWithConfigurationHandler:^(UITextField *textField){
if (QR_PIN==nil) {
textField.placeholder = @"PIN Code";
}else{
[textField setText:QR_PIN];
}
textField.keyboardType = UIKeyboardTypeNumberPad;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(alertTextFieldDidChange:) name:UITextFieldTextDidChangeNotification object:textField];
}];
[self presentViewController:cfg_alertController animated:YES completion:nil];
UIAlertAction *qrcodeAction = [UIAlertAction actionWithTitle:@"QR Code Scanner" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[self showQRScanner];
//[self QRScanAction:nil event:nil];
}];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil];
UITextField *pincode = cfg_alertController.textFields.firstObject;
PIN_cfg = pincode.text;
NSLog(@"<APP> Configure start %@",PIN_cfg);
[self CheckConfigDeviceNumber];
//[TODO]
//[self configAction:PIN_cfg];
//[self startWaiting_progress:@"Device Configuring":120];
}];
if (QR_PIN==nil) {
okAction.enabled = NO;
}else{
okAction.enabled = YES;
}
UIAlertAction *skipAction = [UIAlertAction actionWithTitle:@"Skip" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
NSLog(@"<APP> Configure start skip");
PIN_cfg = PATTERN_DEF_PIN;
[self CheckConfigDeviceNumber];
//[TODO]
//[self configAction:PIN_cfg];
//[self startWaiting_progress:@"Device Configuring":120];
}];
[cfg_alertController addAction:qrcodeAction];
[cfg_alertController addAction:skipAction];
[cfg_alertController addAction:okAction];
}
-(int)configAction: (NSString *)m_PIN
{
timerCount = 0;
int ret = RTK_FAILED;
if (m_context.m_mode == MODE_INIT || m_context.m_mode == MODE_WAIT_FOR_IP) {
#if 1
[simpleConfig rtk_sc_set_sc_model:SC_MODEL_1 duration:-1]; //R2
#else
// check legitimacy and set sc model
if (![m_old_switch isOn]) {
//NSLog(@"Using sc_model_1");
[simpleConfig rtk_sc_set_sc_model:SC_MODEL_1 duration:-1];
}else{
if ([m_old_time.text isEqualToString:@""]) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:SC_UI_ALERT_TITLE_ERROR message:SC_UI_ALERT_WITHOUT_DURATION delegate:self cancelButtonTitle:SC_UI_ALERT_OK otherButtonTitles:nil, nil];
[alert show];
return RTK_FAILED;
}
unsigned int duration = [m_old_time.text intValue];
if (duration==0) {
// R1 mode only
NSLog(@"Using sc_model_2");
[simpleConfig rtk_sc_set_sc_model:SC_MODEL_2 duration:-1];
}else{
// mix mode
NSLog(@"Using sc_model_3 with duration of %d", duration);
[simpleConfig rtk_sc_set_sc_model:SC_MODEL_3 duration:duration];
}
}
#endif
NSString *ssid = m_input_ssid.text;
NSString *pass = m_input_password.text;
NSString *pin = m_PIN;
timerCount = 0;
// build profile and send
//ret = [simpleConfig rtk_sc_config_start:m_input_ssid.text psw:m_input_password.text pin:([m_input_pin.text isEqualToString:@""]?PATTERN_DEF_PIN:m_input_pin.text)];
ret = [simpleConfig rtk_sc_config_start:ssid psw:pass pin:pin];
if (ret==RTK_FAILED) {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:SC_UI_ALERT_TITLE_ERROR message:SC_UI_ALERT_WITHOUT_IP delegate:self cancelButtonTitle:SC_UI_ALERT_OK otherButtonTitles:nil, nil];
[alert show];
return RTK_FAILED;
}
m_context.m_mode = MODE_CONFIG;
[m_control_button setHidden:YES];
[m_config_button setTitle:SC_UI_STOP_BUTTON forState:UIControlStateNormal];
return RTK_SUCCEED;
}else if(m_context.m_mode == MODE_CONFIG){
// stop sending profile
m_context.m_mode = MODE_INIT;
[m_config_button setTitle:SC_UI_START_BUTTON forState:UIControlStateNormal];
[simpleConfig rtk_sc_config_stop];
return RTK_FAILED;
}
return RTK_FAILED;
}
- (IBAction)rtk_scan_listener:(id)sender
{
if (m_context.m_mode == MODE_INIT) {
// do action
[self showQRScanner];
}else{
// don't listen
}
}
/******* private functions *******/
- (NSString *)fetchCurrSSID
{
NSArray *ifs = (id)CFBridgingRelease(CNCopySupportedInterfaces());
NSDictionary *info = nil;
for (NSString *ifnam in ifs) {
info = (id)CFBridgingRelease(CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam));
if (info && [info count]) {
break;
}
#ifdef ARC
[info release];
#endif
}
#ifdef ARC
[ifs release];
#endif
NSString *auto_ssid = [info objectForKey:@"SSID"];
NSLog(@"Current SSID: %@", auto_ssid);
return auto_ssid;
}
-(void)configTimerHandler: (NSTimer *)sender
{
if (simpleConfig==nil || m_timer==nil) {
//NSLog(@"Timer error in config vc");
return;
}
unsigned int sc_mode = [simpleConfig rtk_sc_get_mode];
//NSLog(@"sc_mode = %d", sc_mode);
switch (sc_mode) {
case MODE_INIT:
if (![m_config_button.titleLabel.text isEqualToString:SC_UI_START_BUTTON]) {
[m_config_button setTitle:SC_UI_START_BUTTON forState:UIControlStateNormal];
}
if ([self isWithIPNoName]) {
[self showControlButton];
}
break;
case MODE_CONFIG:
break;
case MODE_WAIT_FOR_IP:
NSLog(@"<APP> MODE_WAIT_FOR_IP\n");
[m_config_button setTitle:SC_UI_START_BUTTON forState:UIControlStateNormal];
//if (m_context.m_mode==MODE_CONFIG)
// m_context.m_mode = MODE_ALERT;
//sleep(5);
//[self showConfigList];
[waitingAlert setTitle:[NSString stringWithFormat:@"Waiting for the device (%lu/%d)", (unsigned long)[simpleConfig.config_list count], g_config_device_num]];
break;
default:
break;
}
}
-(BOOL)isWithIPNoName
{
BOOL ret = NO;
struct dev_info dev;
NSValue *dev_val;
NSMutableArray *list = simpleConfig.config_list;
if (list==nil || [list count]==0) {
return NO;
}
//NSLog(@"current list count=%d", [list count]);
dev_val = [list objectAtIndex:0]; // the earliest dev_info added
[dev_val getValue:&dev];
// check have ip
//NSLog(@"ip of obj0: %x", dev.ip);
ret |= (dev.ip==0)?NO:YES;
if (ret==NO)
return ret;
// check have no name
NSString *curr_name = [NSString stringWithUTF8String:(const char *)(dev.extra_info)];
ret |= ([curr_name isEqualToString:@""] || [curr_name isEqualToString:@"\n"]);
//NSLog(@"name of obj0: %@", curr_name);
return ret;
}
-(void)showConfigList
{
NSLog(@"!!!!! showConfigList !!!!!!");
struct dev_info dev;
NSValue *dev_val;
confirm_list = [[NSMutableArray alloc] initWithArray:simpleConfig.config_list copyItems:YES];
//NSMutableArray *list = simpleConfig.config_list;
[self stopWaiting_progress];
for (int i=0; i<[confirm_list count]; i++) {
dev_val = [confirm_list objectAtIndex:i];
[dev_val getValue:&dev];
NSLog(@"======Dump dev_info %d======",i);
NSLog(@"MAC: %02x:%02x:%02x:%02x:%02x:%02x", dev.mac[0], dev.mac[1],dev.mac[2],dev.mac[3],dev.mac[4],dev.mac[5]);
NSLog(@"Status: %d", dev.status);
NSLog(@"Device type: %d", dev.dev_type);
NSLog(@"IP:%x", dev.ip);
NSLog(@"Name:%@", [NSString stringWithUTF8String:(const char *)(dev.extra_info)]);
}
UIAlertView* confirm_alert = [[UIAlertView alloc] initWithTitle:@"Configured Device"
message:@"uncheck device if any unwanted!"
delegate:self
cancelButtonTitle:@"Confirm"
otherButtonTitles: nil];
confirm_alert.tag = tag_cfg_confirm;
int table_height = 210;
NSInteger focusValue = [confirm_list count];//[confirm_list count]%2==0 ? ((NSInteger)[confirm_list count]/2) : ((NSInteger)[confirm_list count]/2+1);
NSIndexPath *focusIndex = [NSIndexPath indexPathForRow:focusValue inSection:0];
if ([confirm_list count]>0) {
table_height = 75 * (int)[confirm_list count];
if(table_height>400)
table_height = 400;
if (table_height<90) {
table_height = 90;
}
}
UITableView* myView = [[UITableView alloc] initWithFrame:CGRectMake(10, 45, 264, table_height)
style:UITableViewStyleGrouped];
myView.tag = tag_table_confirm;
[myView selectRowAtIndexPath:focusIndex
animated:NO
scrollPosition:UITableViewScrollPositionNone];
[myView setAllowsSelection:NO];
myView.delegate = self;
myView.dataSource = self;
myView.backgroundColor = [UIColor clearColor];
[confirm_alert setValue:myView forKey:@"accessoryView"];
[confirm_alert show];
m_context.m_mode = MODE_INIT;
}
-(void)showControlButton
{
if (m_context.m_mode!=MODE_WAIT_FOR_IP && m_context.m_mode!=MODE_CONFIG)
return;
// TODO
[m_control_button setHidden:NO];
m_context.m_mode = MODE_INIT;
}
/* ------QRCode Related------*/
-(void)showQRScanner
{
int maxScreen_height = [[UIScreen mainScreen] bounds].size.height;
int maxScreen_width = [[UIScreen mainScreen] bounds].size.width;
NSLog(@"screen: %d %d",maxScreen_width,maxScreen_height);
upOrdown = NO;
num = 0;
if(m_qrcode_timer!=nil){
[m_qrcode_timer invalidate];
m_qrcode_timer = nil;
}
//init ZBar
ZBarReaderViewController * reader = [ZBarReaderViewController new];
//set Delegate
reader.readerDelegate = self;
reader.supportedOrientationsMask = ZBarOrientationMaskAll;
reader.showsHelpOnFail = NO;
reader.scanCrop = CGRectMake(0, 0, 1, 1);
ZBarImageScanner * scanner = reader.scanner;
[scanner setSymbology:ZBAR_I25
config:ZBAR_CFG_ENABLE
to:0];
UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, maxScreen_width, maxScreen_height)];
view.backgroundColor = [UIColor clearColor];
reader.cameraOverlayView = view;
//UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 40)];
UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, maxScreen_width/2, 40)];
label.text = @"Scan your QR code";
label.textColor = [UIColor whiteColor];
label.textAlignment = 1;
label.lineBreakMode = 0;
label.numberOfLines = 2;
label.backgroundColor = [UIColor clearColor];
[view addSubview:label];
UIImageView * image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pick_bg.png"]];
//image.frame = CGRectMake(20, 80, 280, 280);
image.frame = CGRectMake(20, 80, maxScreen_width-20*2, maxScreen_width-20*2);
[view addSubview:image];
_line = [[UIImageView alloc] initWithFrame:CGRectMake(20, 80, maxScreen_width-40*2, 1)];
_line.image = [UIImage imageNamed:@"line.png"];
[image addSubview:_line];
//set: after 1.5 s
m_qrcode_timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(qrcode_animation) userInfo:nil repeats:YES];
[self presentViewController:reader animated:YES completion:^{
}];
//[self presentViewController:reader animated:YES completion:nil];
NSLog(@"<APP> scan button finished");
//[text_pincode setText:m_pin_code];
}
-(void)qrcode_animation
{
int maxScreen_width = [[UIScreen mainScreen] bounds].size.width;
if (upOrdown == NO) {
num ++;
_line.frame = CGRectMake(20, 20+2*num, maxScreen_width-40*2, 1);
if (2*num >= (maxScreen_width-30*2)) {
upOrdown = YES;
}
}
else {
num --;
_line.frame = CGRectMake(20, 20+2*num, maxScreen_width-40*2, 1);
if (num <= 0) {
upOrdown = NO;
}
}
}
/* Parse QRCode */
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for(symbol in results)
break;
NSLog(@"Got QRCode: %@", symbol.data);
[m_input_pin setText:symbol.data];
QR_PIN = symbol.data;
//self.imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];
[picker dismissViewControllerAnimated:YES completion:nil];
[self rtk_start_listener:nil];
}
-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
//wait alert show
if(alertView.tag == tag_timer){
if(buttonIndex == 0) {//Cancel
NSLog(@"<APP> wait alert show: Cancel");
timerCount = 0;
[self stopWaiting_progress];
// stop sending profile
m_context.m_mode = MODE_INIT;
[m_config_button setTitle:SC_UI_START_BUTTON forState:UIControlStateNormal];
[simpleConfig rtk_sc_config_stop];
}
}else if(alertView.tag == tag_cfg_confirm){
NSLog(@"<APP> Confirm!");
struct dev_info dev;
NSValue *dev_val;
NSMutableArray *list = confirm_list;
int i = 0;
for (i=0; i<[list count]; i++) {
dev_val = [list objectAtIndex:i];
[dev_val getValue:&dev];
NSLog(@"======Confirm dev_info %d======",i);
NSLog(@"Name:%@", [NSString stringWithUTF8String:(const char *)(dev.extra_info)]);
NSLog(@"IP:%x", dev.ip);
NSLog(@"MAC: %02x:%02x:%02x:%02x:%02x:%02x", dev.mac[0], dev.mac[1],dev.mac[2],dev.mac[3],dev.mac[4],dev.mac[5]);
NSLog(@"Status: %d", dev.status);
NSLog(@"Device type: %d", dev.dev_type);
//user unwanted the device => delete profile
if (dev.status==BIT(2))//unconfirm status
{
unconfirmIndex = i;
if ([self isDeviceConnected:dev.mac[0] m1:dev.mac[1] m2:dev.mac[2] m3:dev.mac[3] m4:dev.mac[4] m5:dev.mac[5] ]) {
NSLog(@"get device ip");
[self performSegueWithIdentifier:@"SegueController" sender:self];
}else{
UIAlertView *wifialertView = [[UIAlertView alloc]
initWithTitle:NSLocalizedString(@"Error", @"AlertView")
message:NSLocalizedString(@"Check fail!!!!", @"AlertView")
delegate:self
cancelButtonTitle:NSLocalizedString(@"OK", @"AlertView")
otherButtonTitles:nil];
[wifialertView show];
}
/*for (j=0;j<10; j++) {
sleep(1);
if ([self isDeviceConnected:dev.mac[0] m1:dev.mac[1] m2:dev.mac[2] m3:dev.mac[3] m4:dev.mac[4] m5:dev.mac[5] ]) {
NSLog(@"get ip");
unconfirmIndex = i;
[self performSegueWithIdentifier:@"SegueController" sender:self];
break;
}
NSLog(@"no ip");
}*/
}
}
}
}
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
int deviceNum = 0;
if (actionSheet.tag == tag_cfg_setNumber){
if(buttonIndex<0 || buttonIndex>7)
return;
deviceNum = (int)(buttonIndex+1);
NSLog(@"Add %ld device!!!",(long)buttonIndex+1);
g_config_device_num = deviceNum;
g_checkFinishWait_cfg = cfg_basic_time + (int)buttonIndex*3;
[self startWaiting_progress:@"Device Configuring":120];
[self configAction:PIN_cfg];
}
}
//--------------------------------- UI table controllers -------------------------------------
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
struct dev_info dev;
static NSString *simpleTableIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
NSMutableArray *list = nil;
NSValue *dev_val;
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
}
//NSMutableArray *list = simpleConfig.config_list;
switch ([tableView tag]) {
case tag_table_confirm:{
list = confirm_list;
//get the element(rowIndex) device
dev_val = [list objectAtIndex:indexPath.row];
[dev_val getValue:&dev];
//cell.textLabel.text = [NSString stringWithFormat:@"Option %d", [indexPath row] + 1];
if(strlen((const char *)(dev.extra_info))==0){
char tmp[16] = {0};
sprintf(tmp, "%02x:%02x:%02x:%02x:%02x:%02x", dev.mac[0], dev.mac[1],dev.mac[2],dev.mac[3],dev.mac[4],dev.mac[5]);
cell.textLabel.text = [NSString stringWithUTF8String:(const char *)tmp];
}else{
cell.textLabel.text = [NSString stringWithUTF8String:(const char *)(dev.extra_info)];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
UISwitch *switchView = [[UISwitch alloc] initWithFrame:CGRectZero];
cell.accessoryView = switchView;
switchView.tag= indexPath.row;
[switchView setOn:YES animated:NO];
[switchView addTarget:self action:@selector(cfgConfirmSwitched:) forControlEvents:UIControlEventValueChanged];
break;
}
default:
break;
}
return cell;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return YES;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [simpleConfig.config_list count];
}
-(void)cfgConfirmSwitched:(id) sender
{
int rowIndex = (int)[sender tag];
UISwitch* switchControl = sender;
struct dev_info selected_dev;
NSValue *dev_val;
NSMutableArray *list = confirm_list;
//get the element(rowIndex) device
dev_val = [list objectAtIndex:rowIndex];
[dev_val getValue:&selected_dev];
if (switchControl.on) {
selected_dev.status = BIT(0); //connected status
}else{
selected_dev.status = BIT(2); //unconfirm status
}
//delete the element(rowIndex) device
[confirm_list removeObjectAtIndex:rowIndex];
//insert the new element(rowIndex) device
NSValue *deviceItem = [NSValue value:&selected_dev withObjCType:@encode(struct dev_info)];
[confirm_list insertObject:deviceItem atIndex: rowIndex];
NSLog( @"switch(%d) %@ status:%d %@",rowIndex, switchControl.on ? @"ON" : @"OFF" , selected_dev.status,
[NSString stringWithUTF8String:(const char *)(selected_dev.extra_info)]);
#if 0
struct dev_info dev;
for (int i=0; i<[list count]; i++) {
dev_val = [list objectAtIndex:i];
[dev_val getValue:&dev];
NSLog(@"<APP> [after changed] Name:%@", [NSString stringWithUTF8String:(const char *)(dev.extra_info)]);
NSLog(@"<APP> [after changed] IP:%x", dev.ip);
NSLog(@"<APP> [after changed] MAC: %02x:%02x:%02x:%02x:%02x:%02x", dev.mac[0], dev.mac[1],dev.mac[2],dev.mac[3],dev.mac[4],dev.mac[5]);
NSLog(@"<APP> [after changed] Device type: %d", dev.dev_type);
NSLog(@"<APP> [after changed] Status: %d", dev.status);
}
#endif
}
//--------------------------------- UI table controllers -------------------------------------
- (BOOL)isDeviceConnected:(unsigned char)m0 m1:(unsigned char)m1 m2:(unsigned char)m2 m3:(unsigned char)m3 m4:(unsigned char)m4 m5:(unsigned char)m5
{
struct dev_info dev;
NSValue *dev_val;
for (int i=0; i<[simpleConfig.config_list count]; i++) {
dev_val = [simpleConfig.config_list objectAtIndex:i];
[dev_val getValue:&dev];
if( (dev.mac[0]==m0) &&
(dev.mac[1]==m1) &&
(dev.mac[2]==m2) &&
(dev.mac[3]==m3) &&
(dev.mac[4]==m4) &&
(dev.mac[5]==m5)){
if (dev.ip==0) {
return NO;
}else
return YES;
}
}
return NO;
}
- (void)alertTextFieldDidChange:(NSNotification *)notification{
UIAlertController *alertController = (UIAlertController *)self.presentedViewController;
if (alertController) {
UITextField *login = alertController.textFields.firstObject;
UIAlertAction *okAction = alertController.actions.lastObject;
BOOL enable = login.text.length == 8;
okAction.enabled = enable;
}
}
- (void)waitingActionThread
{
[self startWaiting:@"Check the device":10.0];
}
//show loading activity.
- (void)startWaiting:(NSString *) wait_title :(float)timeout {
if(waitTimer){
[self stopWaiting];
}
// Purchasing Spinner.
if (!waitingAlert) {
waitingAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(wait_title,@"")
message:@" Please wait...\n"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];
waitingAlert.tag = tag_timer;
UIActivityIndicatorView *actview = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
actview.color=[UIColor blackColor];
//actview.center=CGPointMake(www/2, hhh/2);
[actview startAnimating];
[waitingAlert setValue:actview forKey:@"accessoryView"];
[waitingAlert show];
if (timeout>0) {
waitTimer = [NSTimer scheduledTimerWithTimeInterval: timeout
target: self
selector:@selector(stopWaiting)
userInfo: nil repeats:NO];
}
}
}
-(void)stopWaiting
{
if(waitTimer){
[waitTimer invalidate];
waitTimer = nil;
}
if (waitingAlert) {
[waitingAlert dismissWithClickedButtonIndex:0 animated:YES];
waitingAlert = nil;
}
}
- (void)startWaiting_progress:(NSString *) wait_title :(float)timeout {
if(waitTimer){
[self stopWaiting_progress];
}
// Purchasing Spinner.
waitingAlert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(wait_title,@"")
message:@" Please wait...\n"
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];
waitingAlert.tag = tag_timer;
waitingAlert.alertViewStyle = UIAlertViewStyleDefault;
cfgProgressView = [[UIProgressView alloc] initWithProgressViewStyle:UIProgressViewStyleBar];
[cfgProgressView setTrackTintColor:[UIColor lightGrayColor]];
[cfgProgressView setProgressTintColor:[UIColor blueColor]];
cfgProgressView.frame = CGRectMake(20, 20, 200, 15);
cfgProgressView.progress = 0;
[waitingAlert setValue:cfgProgressView forKey:@"accessoryView"];
//CGRect lblDownloadPercentFrame = CGRectMake([UIScreen mainScreen].bounds.size.width-100
// , [UIScreen mainScreen].bounds.size.height-135, 60, 20);
//lblDownloadPercent = [[UILabel alloc]initWithFrame:lblDownloadPercentFrame];
//lblDownloadPercent.textColor = [UIColor whiteColor];
//lblDownloadPercent.backgroundColor = [UIColor clearColor];
//[waitingAlert setValue:lblDownloadPercent forKey:@"accessoryView"];
[waitingAlert show];
if (timeout>0) {
if ([waitTimer isValid]) {
[waitTimer invalidate];
waitTimer = nil;
}
configTimerStart = NSDate.date.timeIntervalSince1970;
waitTimer = [NSTimer scheduledTimerWithTimeInterval:1.2 target:self selector:@selector(update_progress) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop]addTimer:waitTimer forMode:NSDefaultRunLoopMode];
}
}
- (void)stopWaiting_progress
{
if(waitTimer){
[waitTimer invalidate];
waitTimer = nil;
}
if (waitingAlert) {
[waitingAlert dismissWithClickedButtonIndex:0 animated:YES];
waitingAlert = nil;
}
m_context.m_mode = MODE_INIT;
}
- (void)update_progress
{
if([simpleConfig.config_list count]>=g_config_device_num){
NSLog(@"!!!!! FINISH !!!!!!");
[self showConfigList];
return;
}
int i_persent = 0;
//NSLog(@"update_progress");
#if 0
cfgProgressView.progress +=0.01;
#else
double diffTime = NSDate.date.timeIntervalSince1970 - configTimerStart;
cfgProgressView.progress = (diffTime/120);
#endif
i_persent = 100 * cfgProgressView.progress;
[waitingAlert setMessage:[NSString stringWithFormat:@"Please wait... %d %%", i_persent]];
//when 100%
if (cfgProgressView.progress == 1)
{
[self stopWaiting_progress];
cfgProgressView.progress = 0;
if([simpleConfig.config_list count]>0){
[self showConfigList];
return;
}else{
UIAlertView *wifialertView = [[UIAlertView alloc]
initWithTitle:NSLocalizedString(@"Configuration", @"AlertView")
message:NSLocalizedString(@"Time Out", @"AlertView")
delegate:self
cancelButtonTitle:NSLocalizedString(@"OK", @"AlertView")
otherButtonTitles:/*NSLocalizedString(@"Open settings", @"AlertView"),*/ nil];
[wifialertView show];
}
}
}
@end