Rubymotion + Konashi でフィジカルコンピューティング

みなさま、クリスマスイブをいかがお過ごしでしょうか？
今年はアベノミクスでケーキが良いみたいですね。クリスマスだけに。
ということで、RubyMotion Advent Calendar 2013、24日目スタート！

#Konashi とは
konashi に搭載されている Bluetooth Low Energy モジュールで iPhone と通信し、ハードウェアをいろんころんできます。詳しくはこちら↓↓↓↓
http://konashi.ux-xu.com/

#何か作ってみよう
オンボード入力端子のボタンでカメラのシャッターを押すアプリを作ってみたいと思います。
実際に作ったアプリを動作させたもの↓↓↓↓
http://youtu.be/2AikiDdx1yE
連写しているように見えますが、連写できていません。そこまで手回らんかった。。。

1.cocoapodsを使ってKonashiのライブラリを導入します。

```ruby:Gemfile
gem "motion-cocoapods"
```

2.Rakefileにkonashi-ios-sdkを追加

```ruby:Rakefile
app.pods do
    pod 'konashi-ios-sdk'
end
```

3.コントローラーに接続のための下準備

```ruby:root_controller.rb
def viewDidLoad
  Konashi.initialize
  Konashi.addObserver(self, selector:"update_pio_input", name:KONASHI_EVENT_UPDATE_PIO_INPUT)
end
```

接続のためのボタンも追加

```ruby:root_controller.rb
@btn_find = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |b|
      b.frame = CGRectMake(10, 100, 80, 50)
      b.setTitle("find", forState:UIControlStateNormal)
      b.addTarget(self, action:"find:", forControlEvents:UIControlEventTouchUpInside)
end
self.view.addSubview(@btn_find )
```

メソッドを追加

```ruby:root_controller.rb
def find(sender)
    Konashi.find
end
  
def update_pio_input
    input = Konashi.digitalReadAll
    if input[0] == HIGH # オンボード入力端子
      @imagePickerController.takePicture
    end
end
```

findボタンを押すと、接続可能なKonashiの一覧が表示されます。
KONASHI_EVENT_UPDATE_PIO_INPUT はPIOの入力状態が変化したときのイベントとなります。
ライブラリがしっかりしているので、難しい事を考えなくてもiPhoneとKonashiの相互操作が可能になります。

そして次のステップへ！
http://youtu.be/loZad9r8FP8

#ソース

```ruby:Gemfile
source 'https://rubygems.org'

gem 'rake'
gem "motion-cocoapods"
```

```ruby:Rakefile
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project/template/ios'

begin
  require 'bundler'
  Bundler.require
rescue LoadError
end

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = ''
  app.development do
      app.provisioning_profile = ''
      app.codesign_certificate = ''
  end
  app.pods do
    pod 'konashi-ios-sdk'
  end
end
```

```ruby:app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = UINavigationController.alloc.initWithRootViewController(RootController.alloc.init)
    @window.rootViewController.wantsFullScreenLayout = true
    @window.makeKeyAndVisible
    true
  end
end
```

```ruby:root_controller.rb
class RootController < UIViewController
  def viewDidLoad
    self.navigationController.setNavigationBarHidden(true, animated:false)
    self.view.backgroundColor = UIColor.whiteColor
    
    Konashi.initialize
    Konashi.addObserver(self, selector:"update_pio_input", name:KONASHI_EVENT_UPDATE_PIO_INPUT)
    
    @btn_find = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |b|
      b.frame = CGRectMake(10, 100, 80, 50)
      b.setTitle("find", forState:UIControlStateNormal)
      b.addTarget(self, action:"find:", forControlEvents:UIControlEventTouchUpInside)
    end
    
    @btn_show_camera = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |b|
      b.frame = CGRectMake(100, 100, 80, 50)
      b.setTitle("カメラ起動", forState:UIControlStateNormal)
      b.addTarget(self, action:"show_camera", forControlEvents:UIControlEventTouchUpInside)
    end
    
    [@btn_find, @btn_show_camera].each do |b|
      self.view.addSubview(b)
    end
  end

  def imagePickerController(picker, didFinishPickingImage:image, editingInfo:info)
    self.dismissViewControllerAnimated(true, completion:nil)
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)
    
  end

  def imagePickerControllerDidCancel(picker)
    self.dismissViewControllerAnimated(true, completion:nil)
  end

  private
  
  def show_camera
    @imagePickerController = UIImagePickerController.alloc.init
    @imagePickerController.delegate = self
    @imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera
    self.presentViewController(@imagePickerController, animated:true, completion:nil)
  end
  
  def find(sender)
    Konashi.find
  end
  
  def update_pio_input
    input = Konashi.digitalReadAll
    if input[0] == HIGH # オンボード入力端子
      @imagePickerController.takePicture
    end
  end
end
```