konashiをLチカしてみた

[ユカイ工学][link-1]さんの[konashi][link-2]をゲットしたので、とりあえずLチカしてみました。
[Getting Started][link-3]が上手く動かず、いろいろ試行錯誤してみました。

# 準備するもの

ここは[Getting Started][link-3]＋[CocoaPods][link-5]です。

* [konashi][link-2]本体
* Xcodeが動くMac
* [CocoaPods][link-5]
* BLE搭載のiPhone
* 実機動作させるための各種準備

# Xcodeで新規プロジェクトを作る

[SDK][link-4]は[CocoaPods][link-5]で導入するので、取得するステップは飛ばします。
Xcodeで新規プロジェクトを作成します。
テンプレートは`iOS Application の Single View Application` を選びます。

# [CocoaPods][link-5]で[SDK][link-4]を導入する

前ステップで作成したプロジェクトが開いていると思いますが、邪魔なのでXcodeごとそっと閉じてください。`[プロジェクト名].xcodeproj`がある場所に移動して、

```shell-session
$ pod init
```

を実行しPodfileを作成します。
作成されたPodfileの`target '[プロジェクト名]' do`から`end`までの間に以下のようにSDKの情報を記述します。

```rb
source "https://github.com/CocoaPods/Specs.git"
platform :ios, "7.1"
pod "konashi-ios-sdk", "~> 3.0"
```

その後、同じディレクトリで

```shell-session
$ pod install
```

として、SDKをインストールします。
完了したら、`[プロジェクト名].xcworkspace`をXcodeで開いてください。
（間違えて`[プロジェクト名].xcodeproj`を開かないようにご注意を…）

# CoreBluetoothFrameworkの追加

Xcodeの画面上で最初に作ったプロジェクト名の方のプロジェクトを選択し、TargetsのGeneralの一番下にある`Linked Frameworks and Libraries`のAdd Items（＋）をクリックします。

![Xcode - Linked Frameworks and Libraries](https://qiita-image-store.s3.amazonaws.com/0/35817/10b46a50-d769-c132-a484-1c6188447dce.png)

追加する項目を選択できますので、`CoreBluetooth.framework`を追加してください。

![Xcode - CoreBluetooth.framework](https://qiita-image-store.s3.amazonaws.com/0/35817/b8bb13bd-a6e2-5cc8-9eec-af6051074d18.png)

# konashiと接続するためのボタンを追加

Main.storyboardを開いてボタンを５つ追加します。それぞれ、「Connect(接続)」「DisConnect(切断)」「Check(確認)」「LED ON」「LED OFF」としました。

![Main.storyboard](https://qiita-image-store.s3.amazonaws.com/0/35817/107d4f42-04cc-62d8-db9e-939cea5073b7.png)

ボタンタップ時の動作を追加するため、画面右上にある↓の３連ボタンの真ん中をクリックします。

![３連ボタン](https://qiita-image-store.s3.amazonaws.com/0/35817/db94dde8-9393-38a7-8a9f-f79013426be9.png)

すると、ViewController.mが勝手に開くと思いますのでViewController.hに切り替えます。
以下のように記述します。

```objc
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

- (IBAction)find:(id)sender;
- (IBAction)disconnect:(id)sender;
- (IBAction)check:(id)sender;

- (IBAction)ledOn:(id)sender;
- (IBAction)ledOff:(id)sender;

@end
```

書いたら、先ほど追加したボタンをcontrolボタンを押しながら選択し、そのまま今記述した各メソッドにドラッグ＆ドロップして関連付けます。それぞれ対応は以下のとおりです。

* Connectボタン→ - find:
* DisConnectボタン→ - disconnect:
* Checkボタン→ - check:
* LED ONボタン→ - ledOn:
* LED OFFボタン→ - ledOff:

これで、ボタンをタップすると対応したメソッドが呼び出されるようになります。

# ViewController.mに処理実体を追加

ViewController.mを以下のように記述してください。

```objc
#import "ViewController.h"
#import "Konashi.h"

@interface ViewController ()

@end

@implementation ViewController

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

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

- (IBAction)find:(id)sender {
    [Konashi find];
}

- (IBAction)disconnect:(id)sender {
    [Konashi disconnect];
}

- (IBAction)check:(id)sender {
    NSLog(@"konashi connected = %d", [Konashi isConnected]);
    NSLog(@"konashi ready = %d", [Konashi isReady]);
    NSLog(@"connected module = %@", [Konashi peripheralName]);    
}

- (IBAction)ledOn:(id)sender {
    KonashiResult setPinResult = [Konashi pinMode:KonashiLED2 mode:KonashiPinModeOutput];
    KonashiResult writePinResult = [Konashi digitalWrite:KonashiLED2 value:KonashiLevelHigh];

    NSLog(@"setPinMode = %@", setPinResult == KonashiResultSuccess ? @"Success": @"Failure");
    NSLog(@"write = %@", writePinResult == KonashiResultSuccess ? @"Success" : @"Failure");
}

- (IBAction)ledOff:(id)sender {
    KonashiResult setPinResult = [Konashi pinMode:KonashiLED2 mode:KonashiPinModeOutput];
    KonashiResult writePinResult = [Konashi digitalWrite:KonashiLED2 value:KonashiLevelLow];

    NSLog(@"setPinMode = %@", setPinResult == KonashiResultSuccess ? @"Success": @"Failure");
    NSLog(@"write = %@", writePinResult == KonashiResultSuccess ? @"Success" : @"Failure");
}

@end
```

# 動作確認

実機でアプリを動作させます。端末のBluetoothをONにしておくことをお忘れなく。
Connectボタンをタップすると接続先のKonashiのリストが表示されますので接続先を選びます。

しばらくすると接続が完了します。本来ならば準備完了のイベント`KonashiEventReadyToUseNotification`が発火して次の処理へ繋げられるようなのですが自分の端末では接続先を選んだらすぐに発火してしまい準備完了していないという謎の挙動を示していましたので、準備完了を確認するためにCheckボタンを用意しました。CheckボタンをタップするとNSLogで接続状況や接続先Konashiのモジュール名などが確認できます。

準備完了が確認できましたらLED ONボタンをタップすると、Konashi上のLED2が点灯します。LED OFFボタンをタップすると、点灯中のLED2を消灯できます。

# 参考サイト

* [ユカイ工学][link-1]
* [konashi - A physical computing toolkit for iPhone, iPod touch and iPad][link-2]
* [konashi - Getting Started][link-3]
* [konashi iOS SDK - GitHub][link-4]
* [CocoaPods.org][link-5]

[link-1]:http://www.ux-xu.com/ "ユカイ工学"
[link-2]:http://konashi.ux-xu.com/ "konashi - A physical computing toolkit for iPhone, iPod touch and iPad"
[link-3]:http://konashi.ux-xu.com/ "konashi - Getting Started"
[link-4]:https://github.com/YUKAI/konashi-ios-sdk "konashi iOS SDK - GitHub"
[link-5]:https://cocoapods.org/ "CocoaPods.org"