-
Notifications
You must be signed in to change notification settings - Fork 0
/
Rgpio.cpp
123 lines (98 loc) · 3 KB
/
Rgpio.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <string>
#include "Rgpio.hpp"
#define TAG "GPIO"
namespace helloWorld
{
static void main_power_isr_handler(void* arg);
static xQueueHandle local_q = NULL;
static main_q_payload_t msg;
void Rgpio::gpio_init(xQueueHandle* main_q)
{
gpio_config_t io_conf;
local_q = xQueueCreate(20, sizeof(main_q_payload_t));
io_conf.intr_type = GPIO_INTR_DISABLE;
io_conf.mode = GPIO_MODE_OUTPUT;
io_conf.pin_bit_mask = BIT(GPIO_LED);
io_conf.pull_down_en = GPIO_PULLDOWN_DISABLE;
io_conf.pull_up_en = GPIO_PULLUP_DISABLE;
gpio_config(&io_conf);
set_gpio(GPIO_LED);
io_conf.intr_type = GPIO_INTR_NEGEDGE;
io_conf.pin_bit_mask = BIT(GPIO_MAIN_POWER);
io_conf.mode = GPIO_MODE_INPUT;
io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
gpio_config(&io_conf);
// io_conf.intr_type = GPIO_INTR_ANYEDGE;
// io_conf.pin_bit_mask = BIT(GPIO_BACKUP_POWER);
// io_conf.mode = GPIO_MODE_INPUT;
// io_conf.pull_up_en = GPIO_PULLUP_ENABLE;
// gpio_config(&io_conf);
gpio_install_isr_service(0);
gpio_isr_handler_add(GPIO_MAIN_POWER, main_power_isr_handler,local_q);
// gpio_isr_handler_add(GPIO_BACKUP_POWER, gpio_isr_handler, main_q);
ESP_LOGI(TAG, "GPIO initialised.");
}
void Rgpio::set_gpio(gpio_num_t pin)
{
ESP_LOGI(TAG, "Set GPIO %d", pin);
gpio_set_level(pin, GPIO_SET);
}
void Rgpio::reset_gpio(gpio_num_t pin)
{
ESP_LOGI(TAG, "Reset GPIO %d", pin);
gpio_set_level(pin, GPIO_RESET);
}
bool Rgpio::get_gpio_status(gpio_num_t pin)
{
bool state;
state = gpio_get_level(pin);
//ESP_LOGI(TAG, "Status of GPIO %d is %d", pin, state);
return state;
}
bool Rgpio::check_queue(){
uint32_t *payload = msg.main_payload;
bool bool_payload = msg.bool_payload;
if (xQueueReceive(local_q, &msg, 200)) {
ESP_LOGI(TAG, "Hyyya!!! Here is the queue");
switch(msg.hdr) {
case E_MAIN_MSG_MAIN_POWER_STATUS:
ESP_LOGI(TAG, "Received gpio event");
break;
default:
ESP_LOGI(TAG, "Running default case");
break;
}
return true;
}
else{
ESP_LOGI(TAG, "Queue is not working");
return false;
}
}
static void main_power_isr_handler(void *arg)
{
gpio_isr_handler_remove(GPIO_MAIN_POWER);
//uint32_t* gpio_num = (uint32_t*) GPIO_MAIN_POWER;
// xQueueHandle* local_q = (xQueueHandle*)arg;
msg.hdr = E_MAIN_MSG_MAIN_POWER_STATUS;
msg.bool_payload = true;//gpio_get_level(GPIO_MAIN_POWER);
ets_printf("Hey interrupt me | ");
try{
ets_printf("Trying.");
esp_err_t err;
err = xQueueSendFromISR(local_q, &msg, NULL);
if(err == pdTRUE){
ets_printf("Done ");
}
else{
ets_printf("Throwing Exception\n ");
throw err;
}
}
catch (...){
ets_printf("GOT ERROR");
}
//Here is the pronlem. !!!!
gpio_isr_handler_add(GPIO_MAIN_POWER, main_power_isr_handler, local_q);
}
}; // namespace