Language - Objective C macOS Xcode

From Phidgets Support
Revision as of 21:54, 21 November 2019 by Mparadis (talk | contribs) (Created page with "Category:Language{{NoTitle}} {| |style="vertical-align:middle; width: 60%;"| <font size=6>'''Language - Objective C''' '''MacOS with Xcode'''</font> Welcome to using Phi...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Language - Objective C

MacOS with Xcode

Welcome to using Phidgets with Objective C! By using Objective C, you will have access to the complete Phidget22 API, including events.

Xcode is an IDE provided by Apple that can be used to develop code in a wide variety of programming languages, including Objective C.

Install Phidget Drivers for macOS

If you haven't already, please visit the macOS page before you continue reading. There you will be instructed on how to properly set up your macOS machine so you can follow the guides below!

Use Our Examples

One of the best ways to start programming with Phidgets is to use our example code as a guide. In order to run the examples for macOS you will need to download Xcode from the Mac App Store.


Next, select an example that will work with your Phidget:


Start the example by pressing the Run button:

Macos RunExample.png


The application will attach to the Phidget and show you some basic information. Here is an example of a Digital Output channel on a RFID Phidget:

Macos DigitalOutputExample.png


You should now have the example up and running for your device. Play around with the device and experiment with some of the functionality. When you are ready, the next step is configuring your project and writing your own code!

Configure your project

When you are building a project from scratch, or adding Phidget functionality to an existing project, you'll need to configure your development environment to properly link the Phidget iOS library. To begin:


Create a new Xcode project:

Cocoa CreateProject.png


Next, select a macOS Cocoa application:

Cocoa Application.png


Name that project:

Cocoa NameProject.png


Navigate to your target's Build Settings and find the Framework Search Path setting:

Macos frameworksearch.png


Add a reference to /Library/Frameworks where the Phidget22 framework is installed:

Macos frameworkpath.png


Next, navigate to the Linked Frameworks and Libraries setting under General and add a reference to the Phidget22 framework which is installed to /Library/Frameworks:

Macos linkframework.png


Finally, navigate to your header file and add a reference to phidget22.h

#import <Phidget22/phidget22.h>


Success! Your project now has access to Phidgets.

Write Code

By following the instructions for your operating system and compiler above, you now have working examples and a project that is configured. This teaching section will help you understand how the examples were written so you can start writing your own code.


Remember: your main reference for writing Objective C code will be the Phidget22 API Manual and the example code.

(Refer the the C API when using Objective C)

Step One: Initialize and Open

You will need to declare your Phidget object in your code. For example, we can declare a digital input object like this:

PhidgetDigitalInput ch;


Next, the Phidget object needs to be initialized and opened.

PhidgetDigitalInput_create(&ch);
Phidget_open((PhidgetHandle)ch);


Although we are not including it on this page, you should handle the return values of all Phidget functions. Here is an example of the previous code with error handling:

PhidgetReturnCode res;
const char* errorString;

res = PhidgetDigitalInput_create(&ch);
if(res != EPHIDGET_OK){
  Phidget_getErrorDescription ( returnValue, &errorString );
  NSLog(@"Handle error here");
}

res = Phidget_open((PhidgetHandle)ch);
if(res != EPHIDGET_OK){
  Phidget_getErrorDescription ( returnValue, &errorString );
   NSLog(@"Handle error here");
}

Step Two: Wait for Attachment of the Phidget

Simply calling open does not guarantee you can use the Phidget immediately. To use a Phidget, it must be plugged in (attached). We can handle this by using event driven programming and tracking the attach events. Alternatively, we can modify our code so we wait for an attachment:

PhidgetDigitalInput_create(&ch);
Phidget_openWaitForAttachment(ch, 5000);

Waiting for attachment will block indefinitely until a connection is made, or until the timeout value is exceeded.


To use events to handle attachments, we have to modify our code slightly:

PhidgetDigitalInput_create(&ch);
Phidget_setOnAttachHandler((PhidgetHandle)ch,gotAttach,(__bridge void*)self);
Phidget_open((PhidgetHandle)ch);

Next, we have to declare the function that will be called when an attach event is fired - in this case the function gotAttach will be called:

static void gotAttach(PhidgetHandle phid, void *context){
    [(__bridge id)context performSelectorOnMainThread:@selector(deviceAttached)
                                           withObject:nil
                                        waitUntilDone:NO];
}

Step Three: Do Things with the Phidget

We recommend the use of event driven programming when working with Phidgets. In a similar way to handling an attach event as described above, we can also add an event handler for a state change event:

PhidgetDigitalInput_create(&ch);
Phidget_setOnAttachHandler((PhidgetHandle)ch,gotAttach,(__bridge void*)self);
PhidgetDigitalInput_setOnStateChangeHandler(ch, gotStateChange, (__bridge void*)self);
Phidget_open((PhidgetHandle)ch);

This code will connect a function and an event. In this case, the gotStateChange function will be called when there has been a change to the devices input. Next, we need to create the gotStateChange function.

void gotStateChange(PhidgetDigitalInputHandle phid, void *context, int state){
        [(__bridge id)context performSelectorOnMainThread:@selector(onStateChangeHandler:)
                                               withObject:[NSNumber numberWithInt:state]
                                            waitUntilDone:NO];
}

Above, the onStateChangeHandler method is invoked on the main thread. Event data is stored as an NSNumber.

The method onStateChangeHandler is defined as follows:

- (void)onStateChangeHandler:(NSNumber *)state{
    if(state.intValue)
        stateTextField.stringValue = @"True";
    else
        stateTextField.stringValue = @"False";
}


If events do not suit your needs, you can also poll the device directly for data using code like this:

int state;

PhidgetDigitalInput_getState(ch, &state);
stateTextField.stringValue = [NSString stringWithFormat:@"%@", state ? @"True" : @"False"];

Step Four: Close and Delete

At the end of your program, be sure to close and delete your device:

Phidget_close((PhidgetHandle)ch);
PhidgetDigitalInput_delete(&ch);

What's Next?

Now that you have set up Phidgets to work with your programming environment, we recommend you read our guide on Phidget Programming Basics to learn the fundamentals of programming with Phidgets.Next Arrow.png