Hatena::ブログ(Diary)

hijouguchiの日記

2016-11-26

PSoC で C++ を使う その2

| 23:44 |

前回の続きです。

PSoC5LP では C++ がわかったので、ラッパクラスが作れないか見てみました。

方針としては

1. PSoC Creator が自動生成する関数を struct でまとめる

2. ラッパクラスに (1) を登録して宣言する

3. read(), write() など、よく使うと思われる関数のみ対応

といったところです。

(割り込みは今のところ使う予定が無いので後回しです)

struct の宣言が面倒なのでマクロもあわせて作ってます。

#include <stdint.h>

/* --------------------------------------------------------------------------
 * PSoC SPIM Wrapper Class
 * --------------------------------------------------------------------------
 *
 *  Usage
 *
 *  pdev_spi_t dev = CREATE_PDEV_SPI_T(INSTANCE_NAME);
 *  PSoC_SPIM  spi(&dev);
 *
 *  spi.write(0xXX);
 *  while(!(spi.dev->ReadTxStatus() & spi.STS_BYTE_COMPLETE));
 *  spi.read();
 */

typedef struct {
  void    (*Start)(void);
  uint8_t (*ReadTxStatus)(void);
  uint8_t (*ReadRxStatus)(void);
  void    (*WriteTxData)(uint8_t);
  uint8_t (*ReadRxData)(void);
} pdev_spi_t;

#define CREATE_PDEV_SPI_T(instance_name) { \
  .Start        = instance_name ## _Start, \
  .ReadTxStatus = instance_name ## _ReadTxStatus, \
  .ReadRxStatus = instance_name ## _ReadRxStatus, \
  .WriteTxData  = instance_name ## _WriteTxData, \
  .ReadRxData   = instance_name ## _ReadRxData \
}

class PSoC_SPIM {
  public:
    const pdev_spi_t * const dev;
    static const uint8_t STS_SPI_DONE           = 0x01;
    static const uint8_t STS_TX_FIFO_EMPTY      = 0x02;
    static const uint8_t STS_TX_FIFO_NOT_FULL   = 0x04;
    static const uint8_t STS_BYTE_COMPLETE      = 0x08;
    static const uint8_t STS_SPI_IDLE           = 0x10;
    static const uint8_t STS_RX_FIFO_FULL       = 0x10;
    static const uint8_t STS_RX_FIFO_NOT_EMPTY  = 0x20;
    static const uint8_t STS_RX_FIFO_OVERRUN    = 0x40;

    PSoC_SPIM(pdev_spi_t * _dev) : dev(_dev)
    {
      if(dev->Start) dev->Start();
    }

    inline void    write(uint8_t data) { dev->WriteTxData(data);   }
    inline uint8_t read(void)          { return dev->ReadRxData(); }
};

2016-11-23

PSoC で C++ を使う

| 22:10 |

PSoCC++ が使えないか1年前からいろいろ模索していたのですが、最近の PSoC Creator (3.3) は特に気にせずとも C++ が使えると言うことが分かりました。そのメモを残しておきます。

1. main.c を main.cpp に rename

2. #include <project.h> を extern "C" {} で囲む

サンプルコードはこんな感じです(Lチカ)。

#ifdef __cplusplus
extern "C" {
#endif
#include <project.h>
#ifdef __cplusplus
}
#endif

class DigitalOut {
  private:
    uint8 (*read)(void);
    void (*write)(uint8);
  public:
    DigitalOut(uint8 (*_read)(void), void (*_write)(uint8)) {
      read  = _read;
      write = _write;
    }
    operator uint8() { return (*read)(); }
    void operator =(uint8 _data) { (*write)(_data); }
};

int main()
{

    DigitalOut po(POUT_Read, POUT_Write);
    CyGlobalIntEnable; /* Enable global interrupts. */

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */

    for(;;)
    {
        uint32 i;
        /* Place your application code here. */
        for (i=0; i<1000000; i++);
        po = ~po;
    }
}

/* [] END OF FILE */

後は普通にコンパイルして書き込めば動きました。

おそらく libstd++ は同梱されていないと思うので new やら delete は普通には使えないと思います(未確認)。

これで HOGE_Init() や HOGE_Write() といった関数から別れることが出来そうです。

組み込みとは言え、mbed の様にペリフェラル群もクラスで扱いたかったので、これで上手く隠蔽できるかなと。

2016-02-01

納車

| 22:02 |

ちょうど2ヶ月前に車を買いました。

ダイハツ コペン セロです。

f:id:hijouguchi:20160201220159j:image

以前から車欲しいと思いつつも、貯金も貯まって無かったりホントに乗りたい車も決め切れていなかった中、

ふらっとダイハツディーラーコペンローブが止まってるのを見かけて、よってみました。

内装見て、オープンになるところを見て、それで十分でした。

結局試乗しないまま成約しました。それが8月末の話。

納車まで3ヶ月待って、12月頭に納車でした。

当初は BRZ などのクーペを考えてましたが、値段と軽の割りによく走りそうな印象(試乗すべき)で完全にノックアウト。

納車後初運転となりましたが、期待を超えたフィーリングです。おまけにオープンカー。やっぱり乗ってて楽しい車が良いですね。

自転車でのサイクリングも良いですが、それ以上に行動範囲が広がる車でのドライブも良い物です。

これまでは自転車で行けないところは電車・飛行機などでしたが、電車のあまり走っていない所でも

気軽に行けるようになったのでじゃんじゃん走って見たいですね。

冬は(スタッドレスを履いているとは言え)運転がちょっと怖いので控え気味ですが、春頃になったらもっと遠いところへ行ってみたい物です。

2015-05-11

しまなみ海道ツーリング

| 20:36 |

GWツーリングシリーズ第3弾です。


しまなみ海道+αを走ってきました。しまなみ海道自体も

以前走ったことがあって、今回で2回目だったりします。

しまなみ海道 2015/05/05-07 | Flickr


飛行機で輪行するのは初めてだったのでどうすれば良いのか

調べてみましたが、基本的には(電車とか)普通の輪行と一緒

の様です。貨物スペースも与圧されている様なので空気を抜

く必要はありません。ただ、リアディレイラーはちゃんと保

護すべきでした(ちょっと調節ネジが曲がっちゃった)。


今回は2泊3日(ツーリングは2日間だけ)の旅程で、広島空港

らスタートして、2日で松山空港周辺まで向かうコースでした。

初日は広島空港-竹原-尾道、2日目は尾道-しまなみ海道-今治-

はまかぜ海道-松山、最終日はレンタカー宇和島紫電改

示館まで行ったり。2日目は123kmくらい自転車で走ることになっ

たのでちょっと大変でした。


しまなみ海道は基本的に平坦な所が多く、登り(ほとんどは橋

の直前)も平均3%なのでそんなにきつくは無いです。道も自転

車専用通路があるので走りやすいです。ただし距離は75kmく

らいあります。今治・道後はまかぜ海道は道路があまり良くな

く、もう走りたくないかもです…。

IMGP7573

IMGP7858

IMGP7939



> 箱根湯本: 65km

> 伊豆大島: 70km

> しまなみ海道: 190km

> total: 325km

GW中に300km超走れました。一番辛かったのはスピードについて

行けなかった箱根湯本ツーリングでした。

2015-05-10

伊豆大島ツーリング

| 20:02 |

GW が終わって明日からまた仕事です…(挨拶

第2回ツーリング日記です。2回目は 5/2-5/3 の日程で伊豆大島に行きました(伊豆大島も2回目だったりします)。

伊豆大島 2015/05/02-03 | Flickr


行きも帰りも東海汽船の高速船(ジェットフォイル)に乗ります。

伊豆大島には高速船が到着する港が2つ(元町港、岡田港)あり、当日まで分かりません。

また、自転車輪行状態で 1000 円かかります(片道)。

出航前はチケットを受け取ったり、乗船票に住所などを書く必要があるため、

やや早めに行った方が良いです(だいたい30分前に入れば何とかなりました)。

予約から乗船まで(東海汽船)


初日はお昼過ぎのスタートで、18時までに宿に戻る必要があったため先に三原山へ。

自転車で登れる所まで(御神火茶屋付近)で標高が600m近くまで、一番きつい坂は10%あります。

そこまで行ったら自転車をおいて河口付近まで歩いて行きます。ここもきつい坂があります。

元町港から三原山まで往復30km程度ありました。


2日目は伊豆大島を1周しました。1周(大島一周道路)は44km程度あります。

まわる向きとしては時計回りが良いです。反時計だと登りがきついとのことです。

8:30ごろ元町港付近から出発し、1周まわりきったときには13:30くらいでした。結構ゆっくり

行っても5時間くらいで回れます。休憩含めると時速10km未満なので相当まったり走ってます。

1周走った後まだ時間に余裕があったのでサンセットパームラインコースというコースも走りました。

場所は元町港から大島空港の裏(海岸側)を走るルートで、片道5kmくらいだったとおもいます。

このルートでは海岸近くでダイビングしてる人が結構いました。ダイビングもやってみたいですね。


f:id:hijouguchi:20150510200103p:image

IMGP7397IMGP7412IMGP7495



> 箱根湯本: 65km

> 伊豆大島: 70km

> しまなみ海道:

> total: ???

GW 前半まででおよそ 115km 程度になりました。残るはしまなみ海道です。

既に走ってきましたのでまた今度紹介しようと思います。