sdk-ameba-v4.0c_180328/tools/uart_adapter/app/iOS/uartadapter/ChatViewController.m
2019-04-02 16:34:25 +08:00

348 lines
11 KiB
Objective-C
Executable file
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.

/*
Copyright (C) 2015 Apple Inc. All Rights Reserved.
See LICENSE.txt for this samples licensing information
Abstract:
The secondary detailed view controller for this app.
*/
#import "ChatViewController.h"
#include <ifaddrs.h>
#include <arpa/inet.h>
@interface ChatViewController ()
@end
@implementation ChatViewController
@synthesize inputStream, outputStream;
@synthesize inputMessageField,chatMessageField;
@synthesize selectedService = _selectedService;
@synthesize messages;
NSString *UART_DATA_TYPE=@"_uart_data._tcp.local.";
NSDateFormatter *formatter;
NSString *timeString;
NSMutableAttributedString *attrMessage;
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
UIGraphicsBeginImageContext(self.view.frame.size);
[[UIImage imageNamed:@"background.png"] drawInRect:self.view.bounds];
UIImage *bgImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.chatMessageField.contentMode = UIViewContentModeScaleToFill;
self.chatMessageField.backgroundColor=[UIColor colorWithPatternImage:bgImage];
self.dataServicesArray = [[NSMutableArray alloc] init];
[self startDiscover:UART_DATA_TYPE];
self.inputMessageField.delegate = self;
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:@"UIKeyboardWillShowNotification"
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidHide:)
name:@"UIKeyboardWillHideNotification"
object:nil];
formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"HH:mm"];
NSAttributedString *objectString =
[[NSAttributedString alloc] initWithString:@""
attributes:@{
NSForegroundColorAttributeName : [UIColor redColor],
NSFontAttributeName : [UIFont boldSystemFontOfSize:20]
}];
attrMessage = [[NSMutableAttributedString alloc] initWithAttributedString:objectString];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];
return NO;
}
- (void) keyboardWillShow:(NSNotification *)note {
NSDictionary *userInfo = [note userInfo];
CGSize kbSize = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
// move the view up by 30 pts
CGRect frame = self.view.frame;
frame.origin.y = -kbSize.height;
[UIView animateWithDuration:0.01 animations:^{
self.view.frame = frame;
}];
}
- (void) keyboardDidHide:(NSNotification *)note {
// move the view back to the origin
CGRect frame = self.view.frame;
frame.origin.y = 0;
self.view.frame = frame;
}
-(void) startDiscover:(NSString *)browseType
{
self->_netServiceBrowser = [[NSNetServiceBrowser alloc] init];
self->_netServiceBrowser.delegate = self;
NSArray *domainNameParts = [browseType componentsSeparatedByString:@"."];
browseType = [NSString stringWithFormat:@"%@.%@.", [domainNameParts objectAtIndex:0], [domainNameParts objectAtIndex:1]];
[self->_netServiceBrowser searchForServicesOfType:browseType inDomain:@""];
}
-(void)netServiceBrowser:(NSNetServiceBrowser *)aNetServiceBrowser didFindService:(NSNetService *)aNetService moreComing:(BOOL)moreComing {
[self.dataServicesArray addObject:aNetService];
if (moreComing == NO) {
NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[self.dataServicesArray sortUsingDescriptors:[NSArray arrayWithObject:sd]];
//[sd release];
self->_netServiceBrowser.delegate = nil;
[self->_netServiceBrowser stop];
self->_netServiceBrowser = nil;
self.title = self.selectedService.name;
}
if([self.selectedService.name isEqualToString:aNetService.name])
{
aNetService.delegate = self;
[aNetService resolveWithTimeout:10.0];
}
}
-(void)netServiceDidResolveAddress:(NSNetService *)service {
NSData *address = [service.addresses objectAtIndex:0];
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:(int)service.port];
}
}
- (void)netServiceBrowser:(NSNetServiceBrowser *)netServiceBrowser didRemoveService:(NSNetService *)netService moreComing:(BOOL)moreComing {
for (int i = 0; i < self.dataServicesArray.count; i++) {
if ([((NSNetService *)[self.dataServicesArray objectAtIndex:i]).name isEqualToString:netService.name]) {
[self.dataServicesArray removeObjectAtIndex:i];
break;
}
}
if (moreComing == NO) {
NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
[self.dataServicesArray sortUsingDescriptors:[NSArray arrayWithObject:sd]];
}
}
#pragma mark -
#pragma mark NSNetServiceDelegate methods
-(void)netService:(NSNetService *)sender didNotResolve:(NSDictionary *)errorDict {
NSNumber *errorCode = [errorDict valueForKey:NSNetServicesErrorCode];
NSString *errorMessage;
switch ([errorCode intValue]) {
case NSNetServicesActivityInProgress:
errorMessage = @"Service Resolution Currently in Progress. Please Wait.";
break;
case NSNetServicesTimeoutError:
errorMessage = @"Service Resolution Timeout";
[sender stop];
//UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Bonjour Browser" message:errorMessage delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
// [alert show];
break;
}
//[alert release];
}
#pragma mark -
#pragma mark NSNetServiceBrowserDelegate methods
-(void)netServiceBrowser:(NSNetServiceBrowser *)browser didNotSearch:(NSDictionary *)errorDict {
self->_netServiceBrowser.delegate = nil;
[self->_netServiceBrowser stop];
self->_netServiceBrowser = nil;
}
-(void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser {
self->_netServiceBrowser.delegate = nil;
self->_netServiceBrowser = nil;
}
- (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];
}
- (IBAction) sendMessage {
NSAttributedString *sendingString;
timeString = [formatter stringFromDate:[NSDate date]];
NSString *response = [NSString stringWithFormat:@"%@\n", inputMessageField.text];
NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]];
[outputStream write:[data bytes] maxLength:[data length]];
response = [NSString stringWithFormat:@"%@ [Me] %@\n",timeString, inputMessageField.text];
sendingString =
[[NSAttributedString alloc] initWithString:response
attributes:@{
NSForegroundColorAttributeName : [UIColor blueColor],
NSFontAttributeName : [UIFont boldSystemFontOfSize:20]
}];
inputMessageField.text = @"";
[attrMessage appendAttributedString:sendingString];
[chatMessageField setAttributedText:attrMessage];
[inputMessageField resignFirstResponder];
}
- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
switch (streamEvent) {
case NSStreamEventOpenCompleted:
NSLog(@"Stream opened");
break;
case NSStreamEventHasBytesAvailable:
if (theStream == inputStream) {
uint8_t buffer[1024];
int len;
while ([inputStream hasBytesAvailable]) {
len = [[NSNumber numberWithInteger:[inputStream read:buffer maxLength: sizeof(buffer)]] intValue] ;
if (len > 0) {
NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
if (nil != output) {
[self messageReceived:output];
}
}
}
}
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");
}
}
- (void) messageReceived:(NSString *)message {
NSAttributedString *receivedString;
[self.chatMessageField setTintColor:[UIColor greenColor]];
timeString = [formatter stringFromDate:[NSDate date]];
receivedString =
[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@ [Ameba] %@\n", timeString ,message]
attributes:@{
NSForegroundColorAttributeName : [UIColor purpleColor],
NSFontAttributeName : [UIFont boldSystemFontOfSize:20]
}];
[attrMessage appendAttributedString:receivedString];
[chatMessageField setAttributedText:attrMessage];
}
- (void)viewDidUnload {
[super viewDidUnload];
self->_netServiceBrowser.delegate = nil;
[self->_netServiceBrowser stop];
self->_netServiceBrowser = nil;
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
[inputStream close];
[outputStream close];
self->_netServiceBrowser = nil;
self.dataServicesArray = nil;
self.selectedService = nil;
}
@end