7 Replies Latest reply on Jun 13, 2018 11:59 PM by fj7875cs_1495391

    CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法

    fj7875cs_1495391

      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状態にするためには何が必要でしょうか?スリープに入れる必要がありますか?

        • 1. Re: CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法
          hrtk

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

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

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

          Hirotaka Takayama

          • 2. Re: CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法
            fj7875cs_1495391

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

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

            現在の理解では、「アドバタイズインターバルの周期で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;

             

                }
            }

            • 3. Re: CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法
              e.pratt_1639216

              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.

              • 4. Re: CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法
                fj7875cs_1495391

                e.pratt_1639216さん

                 

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

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

                 

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

                optimization setting.png

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

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

                これもダメでした。

                • 5. Re: CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法
                  hrtk

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

                   

                  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-battery-life-ble

                   

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

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

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

                   

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

                  Hirotaka Takayama

                  • 6. Re: CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法
                    e.pratt_1639216

                    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.

                    • 7. Re: CYBLE_BLESS_STATE_EVENT_CLOSE状態にする方法
                      fj7875cs_1495391

                      Takayamaさん

                       

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

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

                       

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

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