Initial import of Cocoa code
This commit is contained in:
parent
7d3b181094
commit
f08ef9f1e8
17 changed files with 6685 additions and 0 deletions
154
cocoa/NCCurrentCost.m
Normal file
154
cocoa/NCCurrentCost.m
Normal file
|
@ -0,0 +1,154 @@
|
|||
//
|
||||
// CCSerialPort.m
|
||||
// CCSerialPort
|
||||
//
|
||||
// Created by Neil on 02/12/2008.
|
||||
// Copyright 2008 Neil Cowburn. All rights reserved.
|
||||
//
|
||||
|
||||
#import "NCCurrentCost.h"
|
||||
|
||||
@implementation NCCurrentCost
|
||||
|
||||
@synthesize delegate;
|
||||
|
||||
#pragma mark Constructors and destructors
|
||||
|
||||
- (id)init:(NSString *)path withBaudRate:(int)baudRate
|
||||
{
|
||||
if (self = [super init]) {
|
||||
bsdPath = [path copy];
|
||||
baud = baudRate;
|
||||
|
||||
options = (struct termios*)malloc(sizeof(*options));
|
||||
originalOptions = (struct termios*)malloc(sizeof(*originalOptions));
|
||||
}
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)dealloc
|
||||
{
|
||||
[self close];
|
||||
|
||||
free(originalOptions);
|
||||
free(options);
|
||||
|
||||
[serviceType release];
|
||||
[serviceName release];
|
||||
[bsdPath release];
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
#pragma mark Public Methods
|
||||
|
||||
- (void)open
|
||||
{
|
||||
const char *path = [bsdPath fileSystemRepresentation];
|
||||
|
||||
fd = open(path, O_RDONLY | O_NOCTTY);
|
||||
if (fd == -1) {
|
||||
// Error opening the serial port
|
||||
NSLog(@"Error opening serial port");
|
||||
return;
|
||||
}
|
||||
|
||||
if (tcgetattr(fd, originalOptions) == -1) {
|
||||
// Error getting options
|
||||
NSLog(@"Error getting options");
|
||||
return;
|
||||
}
|
||||
|
||||
*options = *originalOptions;
|
||||
handle = [[NSFileHandle alloc] initWithFileDescriptor:fd];
|
||||
|
||||
// Set the baud rate to 2400 bps
|
||||
cfsetspeed(options, B2400);
|
||||
|
||||
options->c_cc[VMIN] = 1;
|
||||
options->c_cc[VTIME] = 10;
|
||||
|
||||
// 8 data bits
|
||||
options->c_cflag |= CS8;
|
||||
|
||||
// No parity
|
||||
options->c_cflag &= ~PARENB;
|
||||
|
||||
// One stop bit
|
||||
options->c_cflag &= ~CSTOPB;
|
||||
|
||||
// No flow control
|
||||
options->c_cflag &= ~(IXON | IXOFF | IXANY);
|
||||
|
||||
if (tcsetattr(fd,TCSANOW, options) != 0) {
|
||||
// Error setting options
|
||||
NSLog(@"Error setting options");
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
- (void)close
|
||||
{
|
||||
fcntl(fd, F_SETFL, fcntl(fd, F_GETFL, 0) | O_NONBLOCK);
|
||||
|
||||
[handle closeFile];
|
||||
[handle release];
|
||||
handle = nil;
|
||||
|
||||
close(fd);
|
||||
fd = -1;
|
||||
}
|
||||
|
||||
- (void)read
|
||||
{
|
||||
char buffer[MAX_CC_BUFFER_SIZE];
|
||||
char *bufPtr;
|
||||
ssize_t numBytes;
|
||||
|
||||
memset(&buffer, 0, sizeof(buffer));
|
||||
bufPtr = buffer;
|
||||
|
||||
do
|
||||
{
|
||||
numBytes = read(fd, bufPtr, MAX_CC_BUFFER_SIZE);
|
||||
if (numBytes > 0)
|
||||
{
|
||||
bufPtr += numBytes;
|
||||
|
||||
if (*(bufPtr - 1) == '\n')
|
||||
{
|
||||
NSRange range = [[NSString stringWithUTF8String:buffer] rangeOfString:@"\n"];
|
||||
|
||||
if ([delegate respondsToSelector:@selector(dataWasReceived:)]) {
|
||||
NSData *rawData = [[NSData alloc] initWithBytes:buffer length:range.location];
|
||||
NSXMLDocument *xml = [[NSXMLDocument alloc] initWithData:rawData options:0 error:nil];
|
||||
|
||||
if (xml != nil) {
|
||||
[delegate performSelectorOnMainThread:@selector(dataWasReceived:) withObject:xml waitUntilDone:YES];
|
||||
}
|
||||
|
||||
[xml release];
|
||||
[rawData release];
|
||||
}
|
||||
|
||||
#ifdef CCDEBUG
|
||||
NSString *sentence = [data substringToIndex:range.location - 1];
|
||||
NSLog(@"%@", sentence);
|
||||
[sentence release];
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
}
|
||||
} while (numBytes > 0);
|
||||
}
|
||||
|
||||
- (void)setDelegate:(id)newDelegate
|
||||
{
|
||||
[newDelegate retain];
|
||||
[delegate release];
|
||||
delegate = newDelegate;
|
||||
}
|
||||
|
||||
@end
|
Loading…
Add table
Add a link
Reference in a new issue