Look in the source code of Quartz Composer Visualizer in QC examples, it has a bunch of networking classes

On Nov 30, 2007, at 9:48 AM, Alamar Tiger wrote:



On Nov 29, 2007 2:54 PM, Christopher Wright <[EMAIL PROTECTED]> wrote: > Has anyone had any luck talking TCP from Quartz Composer? I'm trying to port > over code for ModBUS TCP and I keep running up against syntax errors. I know
> C/Unix, and Darwin/Objective-C is giving me a migraine.

The stardard Unix calls should work (bind, connect, accept, etc). Could
you post some code?

--
[ christopher wright ]
[EMAIL PROTECTED]
http://softpixel.com/~cwright/

Here is the main file, I've corrected the typos causing the syntax errors, but I'm not sure if I'm forgetting anything
major in the resources I'm using. I'm very new to Objective-C.

//
//  Modbus_TCPPlugIn.m
//  Modbus TCP
//
//  Created by Christopher Worley on 11/25/07.
// Copyright (c) 2007 AnthroTigers Multimedia LLC. All rights reserved.
//

#import <OpenGL/CGLMacro.h>

#include <sys/socket.h>
#include <netinet/in.h>

#import "Modbus_TCPPlugIn.h"

#define kQCPlugIn_Name          @"Modbus TCP"
#define kQCPlugIn_Description   @"Modbus TCP Slave Patch"

int sockfd = 0;

@implementation Modbus_TCPPlugIn

@dynamic input_00, input_01, input_02, input_03, input_04, input_05;
@dynamic input_06, input_07, input_08, input_09, input_10, input_11;
@dynamic input_12, input_13, input_14, input_15;
@dynamic output_00, output_01, output_02, output_03, output_04, output_05; @dynamic output_06, output_07, output_08, output_09, output_10, output_11;
@dynamic output_12, output_13, output_14, output_15;
@dynamic portForModbusTCPSlaveCommunication;

+ (NSDictionary*) attributes
{
        return [NSDictionary dictionaryWithObjectsAndKeys:kQCPlugIn_Name,
                QCPlugInAttributeNameKey, kQCPlugIn_Description,
                QCPlugInAttributeDescriptionKey, nil];
}

+ (NSDictionary*) attributesForPropertyPortWithKey:(NSString*)key
{
        if ([key isEqualToString:@"input_00"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 00", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
         if ([key isEqualToString:@"input_01"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 01", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_02"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 02", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_03"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 03", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
         if ([key isEqualToString:@"input_04"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 04", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_05"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 05", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_06"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 06", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
         if ([key isEqualToString:@"input_07"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 07", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_08"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 08", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_09"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 09", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
         if ([key isEqualToString:@"input_10"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 10", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_11"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 11", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_12"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 12", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
         if ([key isEqualToString:@"input_13"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 13", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_14"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 14", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
        if ([key isEqualToString:@"input_15"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Input 15", \
                        QCPortAttributeNameKey, NO, \
                        QCPortAttributeDefaultValueKey, nil];
         if ([key isEqualToString:@"output_00"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 00", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_01"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 01", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_02"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 02", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_03"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 03", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_04"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 04", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_05"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 05", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_06"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 06", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_07"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 07", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_08"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 08", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_09"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 09", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_10"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 10", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_11"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 11", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_12"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 12", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_13"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 13", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_14"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 14", \
                        QCPortAttributeNameKey, nil];
        if ([key isEqualToString:@"output_15"])
                return [NSDictionary \
                        dictionaryWithObjectsAndKeys:@"Output 15", \
                        QCPortAttributeNameKey, nil];
        
        return nil;
}

+ (QCPlugInExecutionMode) executionMode
{
        return kQCPlugInExecutionModeProcessor;
}

+ (QCPlugInTimeMode) timeMode
{
        return kQCPlugInTimeModeIdle;
}

- (id) init
{
        struct sockaddr_in addr;
        if(self = [super init]) {
                sockfd = socket (AF_INET, SOCK_STREAM, 0);
                 bzero (&addr, sizeof(struct sockaddr_in));
                addr.sin_family = AF_INET;
                addr.sin_addr.s_addr = htonl (INADDR_ANY);
                addr.sin_port = htons(502);
                assert(bind(sockfd, (struct sockaddr *)&addr, \
                        sizeof(struct sockaddr)) == 0);
                assert(listen(sockfd, 0));
                listeningSocket = [[NSFileHandle alloc] \
                        initWithFileDescriptor:sockfd];
                 NSNotificationCenter *nc = [NSNotificationCenter \
                        defaultCenter];
                [nc addObserver:self selector:@selector(modbusAccepted) \
                        name:NSFileHandleConnectionAcceptedNotification \
                        object:nil];
                [listeningSocket acceptConnectionInBackgroundAndNotify];
         }      
        return self;
}

- (void) modbusAccepted:(NSNotification *)notification {
        transmissionSocket = [[notification userInfo] \
                        objectForKey:NSFileHandleNotificationFileHandleItem];
        [transmissionSocket retain];
        assert (transmissionSocket != NULL);
        NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
        [nc addObserver:self selector:@selector(modbusPacket) \
                name:NSFileHandleReadCompletionNotification object:nil];
        [transmissionSocket readInBackgroundAndNotify];
}

- (void) modbusPacket:(NSNotification *)notification {
        NSData * messageData;
        NSUInteger transactionIdentifier, protocolIdentifier;
        NSUInteger dataLength, functionCode, memoryRegister[100] = { 0 };
        NSRange dataOffset;
        unsigned char buffer[256] = { 0 };
        messageData = [[notification userInfo] \
                objectForKey:NSFileHandleNotificationDataItem];
        assert(messageData != NULL);
        if ([messageData length] == 0) {
                [transmissionSocket readInBackgroundAndNotify];
                return;
                }
//
// Process ModBUS packet here
//
        dataOffset = NSMakeRange (0, 6);
        [messageData getBytes:buffer range:dataOffset];
        transactionIdentifier = buffer[0] * 256 + buffer[1];
        protocolIdentifier = buffer[2] * 256 + buffer[3];
        dataLength = buffer[4] * 256 + buffer[5];
        if ([messageData length] != (dataLength + 6)) return;
        dataOffset = NSMakeRange (6, dataLength);
        [messageData getBytes:buffer range:dataOffset];
        switch ((int)(buffer[0])) {
                case 0x03: // Read Multiple Registers
                case 0x10: // Write Multiple Registers
                default: return;
                }
        [transmissionSocket readInBackgroundAndNotify];
}

- (void) finalize
{
        [super finalize];
}

- (void) dealloc
{
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        [listeningSocket closeFile];
        [transmissionSocket closeFile];
        [listeningSocket release];
        [transmissionSocket release];
        close (sockfd);
        [super dealloc];
}

+ (NSArray*) plugInKeys
{
        return nil;
}

- (id) serializedValueForKey:(NSString*)key;
{
        return [super serializedValueForKey:key];
}

- (void) setSerializedValue:(id)serializedValue forKey:(NSString*)key
{
         [super setSerializedValue:serializedValue forKey:key];
}

- (QCPlugInViewController*) createViewController
{
        return [[QCPlugInViewController alloc] initWithPlugIn:self \
                viewNibName:@"Modbus_TCPSettings"];
}

@end

@implementation Modbus_TCPPlugIn (Execution)

- (BOOL) startExecution:(id<QCPlugInContext>)context
{
        return YES;
}

- (void) enableExecution:(id<QCPlugInContext>)context
{
}

- (BOOL) execute:(id<QCPlugInContext>)context \
        atTime:(NSTimeInterval)time withArguments:(NSDictionary*)arguments
{
        return YES;
}

- (void) disableExecution:(id<QCPlugInContext>)context
{
}

- (void) stopExecution:(id<QCPlugInContext>)context
{
}

@end

_______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list ([email protected] )
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/pol%40apple.com

This email sent to [EMAIL PROTECTED]

________________________________
Pierre-Olivier Latour - [EMAIL PROTECTED]
Technologist - Apple, Inc.



 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Quartzcomposer-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/quartzcomposer-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to