pebbleでバイブを鳴らしてみる

風邪をひいてぐったりしている間にもう記事のストックがなくなった\(^o^)/

というわけで、もはや書くことないですが、今作ってるアプリ用に調べたことでも書いていきます。

まずはバイブです。

vibe API

APIリファレンスは Pebble SDK: Vibes です。

「バイブを動かすことで、ユーザーに重要なことを通知したりできるけど、電池を消耗するしブルブルし過ぎると迷惑だから控えめにね☆」って書いています。

API 説明
void vibes_short_pulse(void) 短めのバイブ鳴動
void vibes_long_pulse(void) 眺めのバイブ鳴動
void vibes_double_pulse(void) 2回短くバイブ鳴動
void vibes_enqueue_custom_pattern(VibePattern pattern) 好きなパターンでバイブ鳴動
void vibes_cancel(void) 鳴動中のバイブを止める

使い方1

これはたぶんpebbleのAPIの中で一番簡単そうです。

[code lang=c]
void up_single_click_handler(ClickRecognizerRef recognizer, void *context) {
vibes_short_pulse();
}

void down_single_click_handler(ClickRecognizerRef recognizer, void *context) {
vibes_long_pulse();
}

void select_single_click_handler(ClickRecognizerRef recognizer, void *context) {
vibes_double_pulse();
}
[/code]

こんな感じで、バイブ鳴動させたいタイミングでおもむろに呼び出せばOK!

よゆーです。

使い方2

次にカスタムパターンとキャンセルです。

キャンセルは余り使うことが無いかもしれませんが、カスタムパターンで長めの鳴動(アラームとか)をさせたい場合には、ボタンを押したり終了するタイミングでバイブをキャンセルさせましょう。

[code lang=c]
static const VibePattern custom_pattern = {
.durations = (uint32_t []) {1000, 300, 300, 300, 1000, 300},
.num_segments = 6
};

void down_single_click_handler(ClickRecognizerRef recognizer, Window *window) {
vibes_enqueue_custom_pattern(custom_pattern);
}
void up_single_click_handler(ClickRecognizerRef recognizer, Window *window) {
vibes_cancel();
}

void click_config_provider(void *context) {
window_single_click_subscribe(BUTTON_ID_UP, (ClickHandler) up_single_click_handler);
window_single_click_subscribe(BUTTON_ID_DOWN, (ClickHandler) down_single_click_handler);
}

[/code]

VibePatternでカスタムパターンを作成して、vibes_enqueue_custom_patternでバイブ鳴動させています。
VibePatternはCの構造体で詳細はこれです。

.durationsはuint32_tの配列で指定し、1つ最大で10000msまでです。
最初から順にバイブ鳴動する時間、停止する時間、バイブ鳴動する時間、停止する時間・・・と指定します。
num_segmentsはdurationsの配列の長さです。

APIの説明にも有りますが、

[code lang=c]
// Vibe pattern: ON for 200ms, OFF for 100ms, ON for 400ms:
static const uint32_t const segments[] = { 200, 100, 400 };
VibePattern pat = {
.durations = segments,
.num_segments = ARRAY_LENGTH(segments),
};
vibes_enqueue_custom_pattern(pat);
[/code]

こうやって書くと、配列の中の数字を追加削除してもnum_segmentsを設定しなくていいので楽です。

構造体

さて、pebbleで天気を表示してみよう で説明してない気がするので、構造体の説明をします。

構造体は、1つの変数に色々な値を格納できる仕組みです。

例えば、位置を格納したい場合、こんな構造体を作ってみるといいかもです。

[code lang=c]
struct Point {
int x;
int y;
};
[/code]

xとyは構造体のメンバと呼ばれます。

更に位置と色をメンバに持つ「図形」の構造体も考えてみるとこんな感じです。

[code lang=c]
struct Shape {
struct Point pos;
int color;
}
[/code]

構造体はこのままだと毎度structをつけて書く必要があり面倒なので、typedefを使って型に新しい名前をつけます。

[code lang=c]
typedef struct {
int x;
int y;
} Point;

typedef struct {
Point pos;
int color;
} Shape;
[/code]

この時、struct PointのPointは書いても書かなくてもいいのですが、

構造体自体を使う(指す)構造体の場合には、ちゃんと宣言する必要があります。

[code lang=c]
// こっちはだめ
typedef struct {
int val;
Node *next;
} Node;

// こっちならOK
typedef struct Node {
int val;
struct Node *next;
} Node;
[/code]

構造体を利用する場合には、普通の変数と同じように宣言すればOKです。

[code lang=c]
#include

typedef struct {
int x;
int y;
} Point;

typedef struct {
Point pos;
int color;
} Shape;

int main(){
Shape s;
s.pos.x = 10;
s.pos.y = 20;
s.color = 1;

printf(“s.pos.x = %dn”, s.pos.x);
printf(“s.pos.y = %dn”, s.pos.y);
printf(“s.color = %dn”, s.color);

return 0;
}
[/code]

こんなかんじで、Shape sを宣言して、ドットで構造体のメンバを繋いで使うことが出来ます。

また、普通の変数と同様に、宣言時に構造体を初期化することができます。

[code lang=c]
Shape s = {
{10, 20},
1
};
[/code]

上の書き方の場合、メンバの順序を間違えると意図しない動作になります。

メンバを指定したい場合や、一部のメンバだけ初期化したい場合には、初期化指定子を使って初期化することも出来ます。

[code lang=c]
Shape s = {
.pos = {
.x = 10,
.y =20
},
.color = 1
};
}
[/code]

( ´ー`)y-~~(これって昔からできましたっけ・・・?)

まとめ

バイブはpebbleの中で気に入ってる機能の1つです。
どこにでもある、ふつうのバイブ機能ですが、コレのお陰で移動中でもメールや電話に気がつくことが出来ます。

目や音で確認しにくい状態での通知には非常に便利ですよね。

というわけで、プレゼン中に一定感覚でブルブル鳴動してお知らせしつつスライドを操作できれば便利じゃないかと作っているところです。
緊張したり楽しすぎて時間を忘れるような場面でもぺーすはーいぶーんを保もてるのではないかと期待しています。

(そういえば貴族の方々はどこにいったんだろう)