Objective-Cの中にC++を入れる

今作ってるコード

ヘッダファイル

//
//  NWOViewController.h
//  ModelaJogger
//
//  Created by shohei on 11/11/12.
//  Copyright (c) 2012 shohei. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface NWOViewController : UIViewController
{
    //IBOUtletの宣言ってインスタンス変数のフィールド定義ではいらないの?
    //IBOutlet UIButton *X_back_button;
    //IBOutlet UIButton *X_forward_button;
    //IBOutlet UIButton *Y_back_button;
    //IBOutlet UIButton *Y_forward_button;
    //__weak IBOutlet UIButton *spindle_ON_button;
    //__weak IBOutlet UIButton *spindle_OFF_button;
    __weak IBOutlet UILabel *debugConsoleHoge;
}
@property (weak, nonatomic) IBOutlet UILabel *debugConsoleHoge;

@property (weak, nonatomic) IBOutlet UIButton *X_back_button;
@property (weak, nonatomic) IBOutlet UIButton *X_forward_button;
@property (weak, nonatomic) IBOutlet UIButton *Y_back_button;
@property (weak, nonatomic) IBOutlet UIButton *Y_forward_button;
@property (weak, nonatomic) IBOutlet UIButton *spindle_ON_button;
@property (weak, nonatomic) IBOutlet UIButton *spindle_OFF_button;


- (IBAction)X_back:(id)sender;
- (IBAction)X_forward:(id)sender;
- (IBAction)Y_back:(id)sender;
- (IBAction)Y_forward:(id)sender;
- (IBAction)spindle_ON:(id)sender;
- (IBAction)spindle_OFF:(id)sender;

//- (void)drawDebugConsoleHoge;

-(void)showAlert:(NSString *)mojiretsu;


@end

実装ファイル

//
//  NWOViewController.m
//  ModelaJogger
//
//  Created by shohei on 11/11/12.
//  Copyright (c) 2012 shohei. All rights reserved.
//

#import "NWOViewController.h"
//@class NWOViewController;

@interface NWOViewController ()
@end

@implementation NWOViewController

@synthesize debugConsoleHoge;

//Objective-CとC++でやりとりするためのグローバル変数を用意
NSString* moji = [[NSString alloc] init ];

//C++のプロトタイプ宣言
static int ActualFunc();

//How to synthesize manually?
//@synthesize X_back_button,X_forward_button,Y_back_button,Y_forward_button,*spindle_ON_button,spindle_OFF_button;

- (void)viewDidLoad
{
    [super viewDidLoad];
	// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)showAlert:(NSString *)mojiretsu
{
    UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Title!!" message:[NSString stringWithFormat:@"%@ was pushed",mojiretsu] delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"phew", nil];
    [alert show];

}

- (IBAction)X_back:(id)sender {
    [self showAlert:@"X back"];
}

- (IBAction)X_forward:(id)sender {
    [self showAlert:@"X forward"];
}

- (IBAction)Y_back:(id)sender {
    [self showAlert:@"Y back"];
}

- (IBAction)Y_forward:(id)sender {
    [self showAlert:@"Y forward"];
}

- (IBAction)spindle_ON:(id)sender {
    ActualFunc(self);
}

- (IBAction)spindle_OFF:(id)sender {
}


//- (void)drawDebugConsoleHoge{
//    debugConsoleHoge.text = moji;
//}

 


//ここからC++の記法

#include <stdio.h>   /* Standard input/output definitions */
#include <string.h>  /* String function definitions */
#include <unistd.h>  /* UNIX standard function definitions */
#include <fcntl.h>   /* File control definitions */
#include <errno.h>   /* Error number definitions */
#include <termios.h> /* POSIX terminal control definitions */
#include <sys/ioctl.h>



static struct termios gOriginalTTYAttrs;

static int OpenSerialPort()
{
    int        fileDescriptor = -1;
    int        handshake;
    struct termios  options;
    
    // Open the serial port read/write, with no controlling terminal, and don't wait for a connection.
    // The O_NONBLOCK flag also causes subsequent I/O on the device to be non-blocking.
    // See open(2) ("man 2 open") for details.
    
    fileDescriptor = open("/dev/tty.iap", O_RDWR | O_NOCTTY | O_NONBLOCK);
    if (fileDescriptor == -1)
    {
        printf("Error opening serial port %s - %s(%d).\n",
               "/dev/tty.iap", strerror(errno), errno);
        goto error;
    }
    
    // Note that open() follows POSIX semantics: multiple open() calls to the same file will succeed
    // unless the TIOCEXCL ioctl is issued. This will prevent additional opens except by root-owned
    // processes.
    // See tty(4) ("man 4 tty") and ioctl(2) ("man 2 ioctl") for details.
    
    if (ioctl(fileDescriptor, TIOCEXCL) == -1)
    {
        printf("Error setting TIOCEXCL on %s - %s(%d).\n",
               "/dev/tty.iap", strerror(errno), errno);
        goto error;
    }
    
    // Now that the device is open, clear the O_NONBLOCK flag so subsequent I/O will block.
    // See fcntl(2) ("man 2 fcntl") for details.
    
    if (fcntl(fileDescriptor, F_SETFL, 0) == -1)
    {
        printf("Error clearing O_NONBLOCK %s - %s(%d).\n",
               "/dev/tty.iap", strerror(errno), errno);
        goto error;
    }
    
    // Get the current options and save them so we can restore the default settings later.
    if (tcgetattr(fileDescriptor, &gOriginalTTYAttrs) == -1)
    {
        printf("Error getting tty attributes %s - %s(%d).\n",
               "/dev/tty.iap", strerror(errno), errno);
        goto error;
    }
    
    // The serial port attributes such as timeouts and baud rate are set by modifying the termios
    // structure and then calling tcsetattr() to cause the changes to take effect. Note that the
    // changes will not become effective without the tcsetattr() call.
    // See tcsetattr(4) ("man 4 tcsetattr") for details.
    
    options = gOriginalTTYAttrs;
    
    // Print the current input and output baud rates.
    // See tcsetattr(4) ("man 4 tcsetattr") for details.
    
    printf("Current input baud rate is %d\n", (int) cfgetispeed(&options));
    printf("Current output baud rate is %d\n", (int) cfgetospeed(&options));
    
    // Set raw input (non-canonical) mode, with reads blocking until either a single character
    // has been received or a one second timeout expires.
    // See tcsetattr(4) ("man 4 tcsetattr") and termios(4) ("man 4 termios") for details.
    
    cfmakeraw(&options);
    options.c_cc[VMIN] = 1;
    options.c_cc[VTIME] = 10;
    
    // The baud rate, word length, and handshake options can be set as follows:
    
    cfsetspeed(&options, B19200);    // Set 19200 baud
    options.c_cflag |= (CS8);  // RTS flow control of input
    
    
    printf("Input baud rate changed to %d\n", (int) cfgetispeed(&options));
    printf("Output baud rate changed to %d\n", (int) cfgetospeed(&options));
    
    // Cause the new options to take effect immediately.
    if (tcsetattr(fileDescriptor, TCSANOW, &options) == -1)
    {
        printf("Error setting tty attributes %s - %s(%d).\n",
               "/dev/tty.iap", strerror(errno), errno);
        goto error;
    }
    // Success
    return fileDescriptor;
    
    // Failure "/dev/tty.iap"
error:
    if (fileDescriptor != -1)
    {
        close(fileDescriptor);
    }
    
    return -1;
}

static int ActualFunc(NWOViewController *hogehogeController)
{
    int fd;
    char somechar[8];
    fd=OpenSerialPort(); // Open tty.iap with no hardware control, 8 bit, BLOCKING and at 19200 baud
    if(fd>-1)
    {
        write(fd,"*",1); // Write handshaking message over serial
        ///////////////////////////////////////////////////////////////////////////////////////////////////
        // After this, our device or our PC program should be strobing serial ground to gain access to the Iphone Serial Line
        //////////////////////////////////////////////////////////////////////////////////////////////////
        read(fd,&somechar[0],1); // Read 1 byte  over serial.  This will block (wait) untill the byte has been received
        if(somechar[0]=='*') // Check if this byte is a "handshaking" message
        {
            printf("Serial connection established!\n"); // If it is, we have established a connection to the device and can freely read/write over serial!
            while(1) // Do this forever or untill someone presses CTRL+C
            {
                read(fd,&somechar[0],1);  // Read a character over serial!
                putchar(somechar[0]); // Write the character to the Terminal!!
                //moji = somechar[0]; //グローバル変数
                //[[NSString alloc]init]; //普通にNS系のオブジェクトを呼び出せるっぽい
                hogehogeController->debugConsoleHoge.text = @"hogehoge";

            }
        }
    }
    return 0;
}


@end