Skip to content

Commit

Permalink
[ESP32] Adds boot button to toggle LED of lighting-app (#19887)
Browse files Browse the repository at this point in the history
  • Loading branch information
jadhavrohit924 authored Jun 23, 2022
1 parent ae941da commit 1381c8e
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 17 deletions.
11 changes: 7 additions & 4 deletions examples/light-switch-app/esp32/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,13 +118,16 @@ make sure the IDF_PATH has been exported(See the manual setup steps above).

$ ./out/debug/chip-tool accesscontrol write acl '[{"fabricIndex": 1, "privilege": 5, "authMode": 2, "subjects": [112233], "targets": null },{"fabricIndex": 1, "privilege": 3, "authMode": 2, "subjects": [12344320], "targets": null }]' 12344321 0

- we use matter shell to bind and test.
- After successful commissioning, use the chip-tool for binding in
Lighting-switch.

binding:
$ ./out/debug/chip-tool binding write binding '[{"fabricIndex": 1, "node":20836, "endpoint":1, "cluster":6}]' 12344320 1

matter switch binding unicast 1 12344321 1
- Test toggle:

on:
Press `boot` button to toggle LED.

Using matter shell on:

matter switch onoff on

Expand Down
21 changes: 11 additions & 10 deletions examples/light-switch-app/esp32/main/AppTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ using namespace chip;

static const char * TAG = "app-task";

Button AppButton;

namespace {

QueueHandle_t sAppEventQueue;
Expand Down Expand Up @@ -59,6 +61,10 @@ CHIP_ERROR AppTask::Init()
{
CHIP_ERROR err = CHIP_NO_ERROR;

AppButton.Init();

AppButton.SetButtonPressCallback(ButtonPressCallback);

return err;
}

Expand Down Expand Up @@ -132,15 +138,10 @@ void AppTask::SwitchActionEventHandler(AppEvent * aEvent)
}
}

void AppTask::ButtonEventHandler(const uint8_t buttonHandle, uint8_t btnAction)
void AppTask::ButtonPressCallback()
{
AppEvent button_event = {};
button_event.Type = AppEvent::kEventType_Button;
button_event.ButtonEvent.Action = btnAction;

if (buttonHandle == APP_LIGHT_SWITCH && btnAction == BUTTON_PRESSED)
{
button_event.mHandler = SwitchActionEventHandler;
sAppTask.PostEvent(&button_event);
}
AppEvent button_event;
button_event.Type = AppEvent::kEventType_Button;
button_event.mHandler = AppTask::SwitchActionEventHandler;
sAppTask.PostEvent(&button_event);
}
66 changes: 66 additions & 0 deletions examples/light-switch-app/esp32/main/Button.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
*
* Copyright (c) 2022 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#include "Button.h"

#define GPIO_INPUT_IO_0 CONFIG_EXAMPLE_BOARD_BUTTON_GPIO

#define GPIO_INPUT_PIN_SEL (1ULL << GPIO_INPUT_IO_0)
#define ESP_INTR_FLAG_DEFAULT 0

static const char * TAG = "Button";

static Button::ButtonPressCallback button_press_handler = nullptr;

static void IRAM_ATTR gpio_isr_handler(void * arg)
{
if (button_press_handler != nullptr)
{
button_press_handler();
}
}

void Button::Init()
{
/* Initialize button interrupt*/
// zero-initialize the config structure.
gpio_config_t io_conf = {};
// interrupt of rising edge
io_conf.intr_type = GPIO_INTR_NEGEDGE;
// bit mask of the pins, use GPIO4/5 here
io_conf.pin_bit_mask = GPIO_INPUT_PIN_SEL;
// set as input mode
io_conf.mode = GPIO_MODE_INPUT;
// enable pull-up mode
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
gpio_config(&io_conf);

// install gpio isr service
gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT);
// hook isr handler for specific gpio pin
gpio_isr_handler_add(static_cast<gpio_num_t>(GPIO_INPUT_IO_0), gpio_isr_handler, (void *) GPIO_INPUT_IO_0);

ESP_LOGI(TAG, "Button initialized..");
}

void Button::SetButtonPressCallback(ButtonPressCallback button_callback)
{
if (button_callback != nullptr)
{
button_press_handler = button_callback;
}
}
9 changes: 8 additions & 1 deletion examples/light-switch-app/esp32/main/Kconfig.projbuild
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,12 @@ menu "Demo"
default 2 if RENDEZVOUS_MODE_BLE
default 4 if RENDEZVOUS_MODE_THREAD
default 8 if RENDEZVOUS_MODE_ETHERNET


config EXAMPLE_BOARD_BUTTON_GPIO
int "Boot Button GPIO"
default 0 if !IDF_TARGET_ESP32C3
default 9 if IDF_TARGET_ESP32C3
help
GPIO number on which the "Boot" button is connected. This is generally used
by the application for custom operations like toggling states.
endmenu
6 changes: 4 additions & 2 deletions examples/light-switch-app/esp32/main/include/AppTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include <stdint.h>

#include "AppEvent.h"
#include "Button.h"
#include "freertos/FreeRTOS.h"
#include <platform/CHIPDeviceLayer.h>

Expand All @@ -33,15 +34,16 @@
#define APP_ERROR_START_TIMER_FAILED CHIP_APPLICATION_ERROR(0x05)
#define APP_ERROR_STOP_TIMER_FAILED CHIP_APPLICATION_ERROR(0x06)

extern Button AppButton;

class AppTask
{

public:
CHIP_ERROR StartAppTask();
static void AppTaskMain(void * pvParameter);
void PostEvent(const AppEvent * event);

void ButtonEventHandler(const uint8_t buttonHandle, uint8_t btnAction);
static void ButtonPressCallback();

private:
friend AppTask & GetAppTask(void);
Expand Down
30 changes: 30 additions & 0 deletions examples/light-switch-app/esp32/main/include/Button.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
/*
*
* Copyright (c) 2022 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

#pragma once

#include "driver/gpio.h"
#include "esp_log.h"

class Button
{
public:
typedef void (*ButtonPressCallback)(void);

void Init(void);
void SetButtonPressCallback(ButtonPressCallback button_callback);
};

0 comments on commit 1381c8e

Please sign in to comment.