CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
ShMi_1495391
Level 4
Level 4
50 replies posted 25 replies posted 10 replies posted

BLEコンポーネントをBroadcaster設定で、アドバタイズパケットを動的に更新しようとしています。

そのためにCyBle_GapUpdateAdvData();をコールしたいのですが、その前に「CyBle_GetBleSsState() == CYBLE_BLESS_STATE_EVENT_CLOSE」である確認する必要があります。

しかし、CYBLE_BLESS_STATE_EVENT_CLOSE状態になりません。

試しにアドバタイズパケットの送信を開始(CyBle_GappStartAdvertisement)しなくてもCYBLE_BLESS_STATE_EVENT_ACTIVEとなっていました。

CYBLE_BLESS_STATE_EVENT_CLOSE状態にするためには何が必要でしょうか?スリープに入れる必要がありますか?

0 件の賞賛
1 解決策

ご返信遅れ申し訳ございません。

ACTIVEは、「BLESS(BLEサブシステム)がLow Powerモード(Sleep/DeepSleep/Hibernate)でないこと」を意味します。

FYI: CyBle_EnterLPM() APIが、BLESSをLow Powerモードにするために使用されます。

CLOSEは、advertising eventの間の時間なのでご理解いただいている通りです。

ステートの詳細はAN92584の3ページ目をご覧ください。

http://japan.cypress.com/documentation/application-notes/an92584-designing-low-power-and-estimating-...

CYBLE_BLESS_STATE_EVENT_CLOSEはadvertising eventの度に有効になる筈ですが...、何かしらの設定の都合により上手くいっていないのかもしれません。

こちらのページにプログラム例がございますので、ご参照ください。

PSoC-4-BLE/main.c at master · cypresssemiconductorco/PSoC-4-BLE · GitHub

よろしくお願い致します。

Hirotaka Takayama

元の投稿で解決策を見る

0 件の賞賛
7 返答(返信)
HirotakaT_91
Moderator
Moderator
Moderator
500 replies posted 250 replies posted 100 replies posted

こちらのスレッド(CYBLE_BLESS_STATE_EVENT_CLOSERe: Changing an advertisement data. )に記述があります。

advertising radioがオフの時、つまりアクティブなワイヤレス送信がない時にCYBLE_BLESS_STATE_EVENT_CLOSEイベントが発生します。

このイベントは、deep sleepやhibernateなどの状態には関係しません。

Hirotaka Takayama

0 件の賞賛
lock attach
Attachments are accessible only for community members.

迅速なご対応ありがとうございます。

ご紹介いただいたスレッドを参考にさせていただきました。

現在の理解では、「アドバタイズインターバルの周期でACTIVEとCLOSEが繰り返されている」と認識しています。

ACTIVE:アドバタイズパケットを送信している時間

CLOSE:アドバタイズパケットを送信していない時間

正しいでしょうか?

また、作成したプログラムを送付いたします。

シンプルにBLEをBloadcaster設定で動かしているだけのプログラムです。

しかし、メインループでCyBle_GetBleSsState();を監視し続けても、CYBLE_BLESS_STATE_EVENT_CLOSEになることがありません。

「ワイヤレス送信をオフにする」ためには何か別の処理が必要ですか?

CY8CKIT-042-BLEのBaseボードに、CYBLE-222014のモジュール評価キットをセットしてデバッグしています。

以下、main.cの内容です。

#include <project.h>

void StackEventHandler(uint32 event, void* eventParam);

int main (void)
{
    CYBLE_BLESS_STATE_T blessState;
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    CyBle_Start(StackEventHandler);
    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {

        CyBle_ProcessEvents();
        blessState = CyBle_GetBleSsState();
        if(blessState == CYBLE_BLESS_STATE_EVENT_CLOSE)
        {
            break;
        }
    }
}

void StackEventHandler(uint32 event, void *eventParam)
{

    switch(event)
    {
        case CYBLE_EVT_STACK_ON:             
             /*Start advertising*/
              CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);

            break;

        case CYBLE_EVT_GAPP_ADVERTISEMENT_START_STOP:

            if(CyBle_GetState() == CYBLE_STATE_DISCONNECTED)
            {
                /* On advertisement timeout, restart advertisement */
                CyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);
            }

            break;

        default:
            break;

    }
}

0 件の賞賛
Anonymous
適用対象外

Your understanding of ACTIVE and CLOSE is correct.

If you have optimizations set for building the example code, then it will recognize the "dead end" code, and will optimize it out of the program. Double check that you do not have the compiler set to optimize the code at all.

Otherwise, running the program with different advertisement windows/intervals might help, as there needs to be an "inactive" period between advertisements for the "inactive" period to actually occur.

0 件の賞賛

e.pratt_1639216さん

コメントありがとうございます。日本語でも大丈夫でしょうか?

アドバイスいただいたことを試しましたが、変化ありませんでした。

最適化の設定は以下のようにしました。

optimization setting.png

また、StackEventHandler内のCyBle_GappStartAdvertisement(CYBLE_ADVERTISING_FAST);を

2つともCyBle_GappStartAdvertisement(CYBLE_ADVERTISING_SLOW);に変更してみましたが、

これもダメでした。

0 件の賞賛

ご返信遅れ申し訳ございません。

ACTIVEは、「BLESS(BLEサブシステム)がLow Powerモード(Sleep/DeepSleep/Hibernate)でないこと」を意味します。

FYI: CyBle_EnterLPM() APIが、BLESSをLow Powerモードにするために使用されます。

CLOSEは、advertising eventの間の時間なのでご理解いただいている通りです。

ステートの詳細はAN92584の3ページ目をご覧ください。

http://japan.cypress.com/documentation/application-notes/an92584-designing-low-power-and-estimating-...

CYBLE_BLESS_STATE_EVENT_CLOSEはadvertising eventの度に有効になる筈ですが...、何かしらの設定の都合により上手くいっていないのかもしれません。

こちらのページにプログラム例がございますので、ご参照ください。

PSoC-4-BLE/main.c at master · cypresssemiconductorco/PSoC-4-BLE · GitHub

よろしくお願い致します。

Hirotaka Takayama

0 件の賞賛

Takayamaさん

ご紹介いただいたサンプルを参考にさせていただきまして、私のプログラムでは

"CyGlobalIntEnable;"がコメントアウトされていることに気が付きました。

これを有効にするとCLOSE状態に入ることが確認できました。

ありがとうございました。

0 件の賞賛
Anonymous
適用対象外

fj7875cs_1495391​ Generally it is easier to have the threads posted in English for conformity and readability for all users, but with google translate, it is not too difficult.

0 件の賞賛