#include <stdio.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "inttypes.h"
#include "esp_log.h"
#define ledpin 2
#define buttonpin 32
int check = 0;
struct Node {
int data;
struct Node* next;
};
struct Node* createNode(int value) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
printf("Memory allocation failed\n");
exit(1);
}
newNode->data = value;
newNode->next = NULL;
return newNode;
}
void insertAtBeginning(struct Node** head, int value) {
struct Node* newNode = createNode(value);
newNode->next = *head;
*head = newNode;
}
void insertAtEnd(struct Node** head, int value) {
struct Node* newNode = createNode(value);
if (*head == NULL) {
*head = newNode;
return;
}
struct Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
void deleteNode(struct Node** head, int value) {
struct Node* temp = *head;
struct Node* prev = NULL;
// If head itself holds the value
if (temp != NULL && temp->data == value) {
*head = temp->next;
free(temp);
return;
}
// Search for the value
while (temp != NULL && temp->data != value) {
prev = temp;
temp = temp->next;
}
// Value not found
if (temp == NULL) return;
// Unlink the node
prev->next = temp->next;
free(temp);
}
void printList(struct Node* head) {
struct Node* temp = head;
while (temp != NULL) {
printf("%d -> ", temp->data);
temp = temp->next;
}
printf("NULL\n");
}
// Free the list (to avoid memory leaks)
void freeList(struct Node* head) {
struct Node* temp;
while (head != NULL) {
temp = head;
head = head->next;
free(temp);
}
}
static void IRAM_ATTR gpio_isr_handler(void *arg){
if(check==1){
gpio_set_level(ledpin,0);
check=0;
}
else{
gpio_set_level(ledpin,1);
check=1;
}
}
void app_main() {
//printf("Hello, Wokwi!\n");
gpio_reset_pin(ledpin);
gpio_reset_pin(buttonpin);
gpio_set_direction(ledpin,GPIO_MODE_OUTPUT);
gpio_set_direction(buttonpin,GPIO_MODE_INPUT);
gpio_set_pull_mode(buttonpin,GPIO_PULLUP_ONLY);
gpio_set_intr_type(buttonpin,GPIO_INTR_NEGEDGE);
gpio_install_isr_service(0);
gpio_isr_handler_add(buttonpin,gpio_isr_handler,NULL);
gpio_intr_enable(buttonpin);
struct Node* head = NULL;
insertAtBeginning(&head, 10);
insertAtBeginning(&head, 20);
insertAtEnd(&head, 30);
insertAtEnd(&head, 40);
printf("Linked List: ");
printList(head);
printf("Deleting 20...\n");
deleteNode(&head, 20);
printList(head);
freeList(head);
while (true) {
// gpio_set_pull_mode(buttonpin,GPIO_PULLUP_ONLY);
// if(gpio_get_level(buttonpin)==false){
// if(check==1){
// gpio_set_level(ledpin,0);
// printf("1\n");
// check=0;
// }
// else{
// printf("2\n");
// gpio_set_level(ledpin,1);
// check=1;
// }
// }
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}