sdk-ameba-v4.0c_180328/tools/uart_adapter/app/iOS/uartadapter/SettingPageViewController.m

580 lines
18 KiB
Mathematica
Raw Normal View History

2019-04-02 08:34:25 +00:00
//
// SettingPageViewController.m
// uartadapter
//
// Created by isaiah on 9/1/15.
// Copyright (c) 2015 realtek. All rights reserved.
//
//#import <Foundation/Foundation.h>
#import "ViewController.h"
#import "SettingPageViewController.h"
#include <ifaddrs.h>
#include <arpa/inet.h>
uint8_t const cmdPrefix[] = { 0x41, 0x4D, 0x45, 0x42, 0x41, 0x5F, 0x55, 0x41, 0x52, 0x54 };;
uint8_t const cmdGetAllSetting[] = { 0x02, 0x00, 0x0f };
NSMutableArray *settingIOTInfoArray;
@interface SettingPageViewController ()
@end
@implementation SettingPageViewController
@synthesize inputStream, outputStream;
@synthesize selectedService = _selectedService;
@synthesize baudRateField, dataBitField, parityBitField, stopBitField;
@synthesize allSettings = _allSettings;
//@synthesize datapicker;
//UIAlertView *alert;
NSArray * baurateData ;
NSArray * bitData;
NSArray * parityBitData;
NSArray * stopBitdata;
int mBardRate = 0;
int mDataBit = 0;
int mParityBit = 0;
int mStopBit = 0;
UIPickerView *datapicker;
int mTextFieldTag = -1;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]];
baurateData = [[NSArray alloc] initWithObjects:@"1200", @"9600", @"14400", @"19200", @"28800", @"38400", @"57600", @"76800", @"115200", @"128000", @"153600", @"230400", @"460800", @"500000", @"921600", nil];
bitData = [[NSArray alloc] initWithObjects:@"7", @"8", nil];
parityBitData = [[NSArray alloc] initWithObjects:@"none", @"odd", @"even", nil];
stopBitdata = [[NSArray alloc] initWithObjects:@"none", @"1", nil];
datapicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 50, 100, 150)];
[datapicker setDataSource: self];
[datapicker setDelegate: self];
[baudRateField setDelegate:self];
[dataBitField setDelegate:self];
[parityBitField setDelegate:self];
[stopBitField setDelegate:self];
datapicker.showsSelectionIndicator = YES;
self.baudRateField.inputView = datapicker;
self.dataBitField.inputView = datapicker;
self.parityBitField.inputView = datapicker;
self.stopBitField.inputView = datapicker;
if([self inputStreamReceivedParser:self.allSettings] == 1)//update ui
{
self.baudRateField.text = [NSString stringWithFormat:@"%d",mBardRate];
self.dataBitField.text = [NSString stringWithFormat:@"%d",mDataBit];
if (mParityBit == 0)
self.parityBitField.text = @"none";
else if (mParityBit == 1)
self.parityBitField.text = @"odd";
else if (mParityBit == 2)
self.parityBitField.text = @"even";
if (mStopBit == 0)
self.stopBitField.text = @"none";
else if (mStopBit == 1)
self.stopBitField.text = @"1";
// [alert dismissWithClickedButtonIndex:0 animated:YES];
}
//[self prepareForInitNetworkCommunication];
/*
alert = [[UIAlertView alloc] initWithTitle:@"UART Adapter" message:@"Connecting" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:nil];
UIActivityIndicatorView * alertIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(125.0, 00.0, 30.0, 30.0) ];
alertIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
//alertIndicator.center = CGPointMake(alert.bounds.size.width/2 , (alert.bounds.size.height/2) + 10);
[alertIndicator startAnimating];
if ([[[UIDevice currentDevice] systemVersion]compare:@"7.0"] != NSOrderedAscending)
[alert setValue:alertIndicator forKey:@"accessoryView"];
else
[alert addSubview:alertIndicator];
// [alert show];
*/
/*
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self queryAllSettings];
});
*/
}
- (IBAction) restoreSettings
{
self.baudRateField.text = [NSString stringWithFormat:@"%d",mBardRate];
self.dataBitField.text = [NSString stringWithFormat:@"%d",mDataBit];
if (mParityBit == 0)
self.parityBitField.text = @"none";
else if (mParityBit == 1)
self.parityBitField.text = @"odd";
else if (mParityBit == 2)
self.parityBitField.text = @"even";
if (mStopBit == 0)
self.stopBitField.text = @"none";
else if (mStopBit == 1)
self.stopBitField.text = @"1";
[datapicker reloadAllComponents];
}
- (IBAction) saveSettings{
NSString * stringTxtField;
uint8_t cmdReq[] = {0x00};
uint8_t *cmdBaudrate = NULL;
uint8_t *cmdDatabit = NULL;
uint8_t *cmdParity = NULL;
uint8_t *cmdStopbit = NULL;
stringTxtField = self.baudRateField.text;
if([stringTxtField isEqualToString:@"1200"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0xB0, 0x04, 0x00, 0x00 };
}else if([stringTxtField isEqualToString:@"9600"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x80, 0x25, 0x00, 0x00 };
}else if([stringTxtField isEqualToString:@"14400"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x40, 0x38, 0x00, 0x00 };
}else if([stringTxtField isEqualToString:@"19200"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0x4B, 0x00, 0x00 };
}else if([stringTxtField isEqualToString:@"28800"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x80, 0x70, 0x00, 0x00 };
}else if([stringTxtField isEqualToString:@"38400"]){
cmdBaudrate = (uint8_t []){ 0x00, 0x01, 0x04, 0x00, 0x96, 0x00, 0x00 };
}else if([stringTxtField isEqualToString:@"57600"]){
cmdBaudrate = (uint8_t []){ 0x00, 0x01, 0x04, 0x00, 0xE1, 0x00, 0x00 };
}else if([stringTxtField isEqualToString:@"76800"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0x2C, 0x01, 0x00 };
}else if([stringTxtField isEqualToString:@"115200"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0xC2, 0x01, 0x00 };
}else if([stringTxtField isEqualToString:@"128000"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0xF4, 0x01, 0x00 };
}else if([stringTxtField isEqualToString:@"153600"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0x58, 0x02, 0x00 };
}else if([stringTxtField isEqualToString:@"230400"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0x84, 0x03, 0x00 };
}else if([stringTxtField isEqualToString:@"460800"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0x08, 0x07, 0x00 };
}else if([stringTxtField isEqualToString:@"500000"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x20, 0xA1, 0x07, 0x00 };
}else if([stringTxtField isEqualToString:@"921600"]){
cmdBaudrate = (uint8_t []) { 0x00, 0x01, 0x04, 0x00, 0x10, 0x0E, 0x00 };
}
stringTxtField = self.dataBitField.text;
if([stringTxtField isEqualToString:@"8"]){
cmdDatabit = (uint8_t []) { 0x00, 0x02, 0x01, 0x08 };
}else{
cmdDatabit = (uint8_t []) { 0x00, 0x02, 0x01, 0x07 };
}
stringTxtField = self.parityBitField.text;
if([stringTxtField isEqualToString:@"none"]){
cmdParity = (uint8_t []) { 0x00, 0x04, 0x01, 0x00 };
}else if([stringTxtField isEqualToString:@"odd"]){
cmdParity = (uint8_t []) { 0x00, 0x04, 0x01, 0x01 };
}else if([stringTxtField isEqualToString:@"even"]){
cmdParity = (uint8_t []) { 0x00, 0x04, 0x01, 0x02 };
}
stringTxtField = self.stopBitField.text;
if([stringTxtField isEqualToString:@"none"]){
cmdStopbit = (uint8_t []) { 0x00, 0x08, 0x01, 0x00 };
}else if([stringTxtField isEqualToString:@"1"]){
cmdStopbit = (uint8_t []) { 0x00, 0x08, 0x01, 0x01 };
}
NSMutableData *cmdSetSettings = [[NSMutableData alloc] initWithBytes:cmdPrefix length:sizeof(cmdPrefix)];
[cmdSetSettings appendBytes:cmdReq length:1];
[cmdSetSettings appendBytes:cmdBaudrate length:7];
[cmdSetSettings appendBytes:cmdDatabit length:4];
[cmdSetSettings appendBytes:cmdParity length:4];
[cmdSetSettings appendBytes:cmdStopbit length:4];
if (self.selectedGroupID != 0) {
for (int i=0 ; i < settingIOTInfoArray.count; i++) {
NSNetService * groupIOTDevice = [settingIOTInfoArray objectAtIndex:i];
[self prepareForInitNetworkCommunication:[groupIOTDevice.addresses objectAtIndex:0 ] Port:(int)groupIOTDevice.port];
[outputStream write:[cmdSetSettings bytes] maxLength:[cmdSetSettings length]];
}
}else{
[self prepareForInitNetworkCommunication:[self.selectedService.addresses objectAtIndex:0 ] Port:(int)self.selectedService.port];
[outputStream write:[cmdSetSettings bytes] maxLength:[cmdSetSettings length]];
}
}
+ (void) initSettingIOTInfoArray
{
settingIOTInfoArray = [[NSMutableArray alloc] init];
}
+ (void) copyIOTInfo:(NSNetService *)mService
{
[settingIOTInfoArray addObject:mService];
// struct _IOTInfo IOTInfo;
//settingIOTInfoArray = [[NSMutableArray alloc] init];
// for (int i = 0; i < mIOTInfoArray.count; i++) {
// [[mIOTInfoArray objectAtIndex:i] getValue:&IOTInfo];
// [settingIOTInfoArray addObject:[NSValue valueWithBytes:&IOTInfo objCType:@encode(struct _IOTInfo)]];
//}
}
- (void) queryAllSettings {
NSMutableData *cmd = [[NSMutableData alloc] initWithBytes:cmdPrefix length:sizeof(cmdPrefix)];
[cmd appendBytes:cmdGetAllSetting length:sizeof(cmdGetAllSetting)];
[outputStream write:[cmd bytes] maxLength:[cmd length]];
}
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
switch (streamEvent) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (theStream == inputStream) {
uint8_t buffer[64] = {0};
int len;
while ([inputStream hasBytesAvailable]) {
len = [[NSNumber numberWithInteger:[inputStream read:buffer maxLength: sizeof(buffer)]] intValue] ;
if (len > 0) {
NSData *output = [[NSData alloc] initWithBytes:buffer length:len];
if (nil != output) {
if([self inputStreamReceivedParser:output] == 1)//update ui
{
self.baudRateField.text = [NSString stringWithFormat:@"%d",mBardRate];
self.dataBitField.text = [NSString stringWithFormat:@"%d",mDataBit];
if (mParityBit == 0)
self.parityBitField.text = @"none";
else if (mParityBit == 1)
self.parityBitField.text = @"odd";
else if (mParityBit == 2)
self.parityBitField.text = @"even";
if (mStopBit == 0)
self.stopBitField.text = @"none";
else if (mStopBit == 1)
self.stopBitField.text = @"1";
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Serial Port Setup" message:@"Success!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alert show];
}
}
}
}
break;
case NSStreamEventErrorOccurred:
NSLog(@"Can not connect to the host!");
break;
case NSStreamEventEndEncountered:
[theStream close];
[theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
//[theStream release];
theStream = nil;
break;
default:
NSLog(@"Unknown event");
}
}
- (int) inputStreamReceivedParser:(NSData *)message {
uint8_t *recvCmd = (uint8_t *)[message bytes] ;
if ([self checkPrefix:recvCmd]){
int readbit = 10;
if (recvCmd[readbit] == 0x01) { //response for ack
return 0;//ok
}else if (recvCmd[readbit] == 0x03) { //response for getting
mBardRate = 0;
mDataBit = 0;
mParityBit = 0;
mStopBit = 0;
readbit+=2;
do{
if (recvCmd[readbit] == 0x01) { //baudrate
int bit = 0;
int tmp = 0;
int byteLen = recvCmd[++readbit];
readbit++;
for (int i=readbit; i < (readbit+byteLen); i++) {
tmp = (recvCmd[i] & 0xFF) << (8*bit);
mBardRate += tmp;
bit++;
}
readbit+=(byteLen+1);
}else if (recvCmd[readbit] == 0x02) { //data
int byteLen = recvCmd[++readbit];
readbit++;
if (byteLen == 1)
mDataBit = recvCmd[readbit];
else{
return -1;
}
readbit+=(byteLen+1);
}else if (recvCmd[readbit] == 0x04) { //parity
int byteLen = recvCmd[++readbit];
readbit++;
if (byteLen == 1)
mParityBit = recvCmd[readbit];
else{
return -1;
}
readbit+=(byteLen+1);
}else if (recvCmd[readbit] == 0x08) { //stopbit
int byteLen = recvCmd[++readbit];
readbit++;
if (byteLen == 1)
mStopBit = recvCmd[readbit];
else{
return -1;
}
readbit+=(byteLen+1);
}else
readbit++;
}while (readbit < [message length]);
return 1;//update UI
}//if (recvCmd[readbit] == 0x01)
}
return 2;//other
}
- (Boolean) checkPrefix:(uint8_t *) recvPrefix
{
for (int i = 0; i < sizeof(cmdPrefix); i++) {
if(recvPrefix[i] != cmdPrefix[i])
return false;
}
return true;
}
-(void)prepareForInitNetworkCommunication:(NSData *)mAddress Port:(int)mPort {
NSData *address = mAddress;
char addressString[INET6_ADDRSTRLEN];
int inetType;
struct sockaddr_in6 addr6;
memcpy(&addr6, address.bytes, address.length);
if (address.length == 16) { // IPv4
inetType = AF_INET;
struct sockaddr_in addr4;
memcpy(&addr4, address.bytes, address.length);
inet_ntop(AF_INET, &addr4.sin_addr, addressString, 512);
[self initNetworkCommunication:[NSString stringWithCString:addressString encoding:NSASCIIStringEncoding] Port:mPort];
}
}
- (void) initNetworkCommunication:(NSString *)mIP Port:(int)mPort {
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)mIP, mPort, &readStream, &writeStream);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
mTextFieldTag = (int)textField.tag;
[datapicker reloadAllComponents];
}
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
switch (mTextFieldTag) {
case 0:
self.baudRateField.text = baurateData[row];
break;
case 1:
self.dataBitField.text = bitData[row];
break;
case 2:
self.parityBitField.text = parityBitData[row];
break;
case 3:
self.stopBitField.text = stopBitdata[row];
break;
default:
break;
}
[[self view] endEditing:YES];
}
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
switch (mTextFieldTag) {
case 0:
return baurateData[row];
break;
case 1:
return bitData[row];
break;
case 2:
return parityBitData[row];
break;
case 3:
return stopBitdata[row];
break;
default:
return 0;
break;
}
}
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1 ;
}
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
switch (mTextFieldTag) {
case 0:
return baurateData.count;
break;
case 1:
return bitData.count;
break;
case 2:
return parityBitData.count;
break;
case 3:
return stopBitdata.count;
break;
default:
return 0;
break;
}
}
- (void)viewDidUnload {
[super viewDidUnload];
settingIOTInfoArray = nil;
}
- (void)dealloc
{
[inputStream close];
[outputStream close];
self.selectedService = nil;
settingIOTInfoArray = nil;
}
@end