intel edisonからkoshian(konashi)のI2Cを動かしてみた

[インテルEdison + BLEで、konashi/SBBLEを動かしてみた。](http://blog.goo.ne.jp/roboz80/e/c4d6aefbd2ba690565eceaf956141f81)
こちらの記事を参考にさせていただいてI2Cを動かしてみました。
**koshian**で動作を確認しましたが、UUIDを変えれば**konashi**でも動くと思います
(持ってるんだから確認しろよって話ですが…)。

I2Cの通信相手(スレーブ)は[Uzukiセンサーシールド](http://www.m-pression.com/ja/solutions/boards/uzuki-shield;jsessionid=53E231695E9B617450F7EF6AAE569721)上の**Si7013**(温湿度センサ)とし、温度を取得しています。

以下サンプルです(ほぼ初めてのjs)。
15行目くらいまでは、上記のコードそのままです。
サンプルコード
============
```js:koshian_i2c.js
var noble = require('./index');

const ADDR_Si7013 = 0x40
const CMD_TEMP    = 0xE3

const KOSHIAN_I2C_MODE_ENABLE_100K  = 0x01

const KOSHIAN_I2C_CONDITION_STOP    = 0x00
const KOSHIAN_I2C_CONDITION_START   = 0x01
const KOSHIAN_I2C_CONDITION_RESTART = 0x02

function calculateTemperature(data){
  return (data[0]*256 + data[1])*175.72/65536 - 46.85
}

noble.on('stateChange', function(state){
  if (state === 'poweredOn') noble.startScanning();
  else noble.stopScanning();
});

noble.on('discover', function(peripheral){
  noble.stopScanning();
  console.log('peripheral with UUID ' + peripheral.uuid + ' found');
  var advertisement = peripheral.advertisement;
  var localName = advertisement.localName;
  if (localName){
    console.log('Local Name = ' + localName);
  }

  peripheral.connect(function(error){
    if (error) console.log('connect error: ' + error);
    console.log('connected to ' + peripheral.uuid);

    peripheral.discoverServices(['229bff0003fb40da98a7b0def65c2d4b'], // KONASHI_SERVICE_UUID
      function (error, services){
        if (error) console.log('discoverServices error: ' + error);
        console.log('services.length: ' + services.length);

        var konashiService = services[0];
        konashiService.discoverCharacteristics(
          ['229b300b03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_CONFIG_UUID
           '229b300c03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_START_STOP_UUID
           '229b300d03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_WRITE_UUID 
           '229b300e03fb40da98a7b0def65c2d4b',  // KONASHI_I2C_READ_PARAM_UUID 
           '229b300f03fb40da98a7b0def65c2d4b'], // KONASHI_I2C_READ_UUID
          function(error, characteristics){
            if (error) console.log('discoverCharacteristics error: ' + error);
            console.log('characteristics.length: ' + characteristics.length);

            // enable I2C
            characteristics[0].write(new Buffer([KOSHIAN_I2C_MODE_ENABLE_100K]), false);
            var i = 0;
            setInterval(function(){
              // send StartCondition
              characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_START]), false, function(error){
                // send register-address/command
                characteristics[2].write(new Buffer([2, (ADDR_Si7013 << 1) & 0xFE, CMD_TEMP]), false, function(error){
                  // send RestartCondition
                  characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_RESTART]), false, function(error){
                    // request data read 
                    characteristics[3].write(new Buffer([2, (ADDR_Si7013 << 1) | 0x01]), false, function(error){
                      // send StopCondition
                      characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_STOP]), false);
                      // read received data
                      characteristics[4].read(function(error, data){
                        if (data){
                          console.log( i++ + ' - temperature : ' + calculateTemperature(data) + ' degC');
                        }
                      });
                    });
                  });
                });
              });
            }, 1000);
          }
        );
      }
    );
  });
});
```
Callback Hell ?
=====================
流れとしては、
スタートコンディション→
スレーブアドレス+W+コマンド→
リスタートコンディション→
スレーブアドレス+R→
(データ受信)→
ストップコンディション
という流れになっていますが、
これをコールバックで呼び出さずにツラツラと並べただけでは、
何回かループが回ったところで止まってしまいました。
発行したリクエストが前後してしまうのでしょうかね?

今日は温かい1日でしたね、室温が21度ありました。