@@ -53,6 +53,73 @@ static bool do_retrieve_file(http_connection conn, char *path, void *context)
53
53
return false;
54
54
}
55
55
56
+ static bool do_handle_api_call (http_connection conn , char * path , void * context )
57
+ {
58
+ static int s_InitializedMask = 0 ;
59
+
60
+ if (!strcmp (path , "readpins" ))
61
+ {
62
+ http_write_handle reply = http_server_begin_write_reply (conn , "200 OK" , "text/json" );
63
+ http_server_write_reply (reply , "{\"led0v\": \"%d\"" , cyw43_arch_gpio_get (0 ));
64
+
65
+ int values = gpio_get_all ();
66
+
67
+ for (int i = 0 ; i < 29 ; i ++ )
68
+ {
69
+ if (i > 22 && i < 26 )
70
+ continue ;
71
+
72
+ if (s_InitializedMask & (1 << i ))
73
+ http_server_write_reply (reply , ",\"gpio%dd\": \"%s\",\"gpio%dv\": \"%d\"" , i , gpio_get_dir (i ) ? "OUT" : "IN" , i , (values >> i ) & 1 );
74
+ }
75
+
76
+ http_server_end_write_reply (reply , "}" );
77
+ return true;
78
+ }
79
+ else if (!memcmp (path , "writepin/" , 9 ))
80
+ {
81
+ //e.g. 'writepin/led0?v=1'
82
+ char * port = path + 9 ;
83
+ char * arg = strchr (port , '?' );
84
+ if (arg )
85
+ {
86
+ * arg ++ = 0 ;
87
+ char * value = strchr (arg , '=' );
88
+ * value ++ = 0 ;
89
+
90
+ if (!strcmp (port , "led0" ))
91
+ cyw43_arch_gpio_put (0 , value [0 ] == '1' );
92
+ else if (!memcmp (port , "gpio" , 4 ))
93
+ {
94
+ int gpio = atoi (port + 4 );
95
+ if (!(s_InitializedMask & (1 << gpio )))
96
+ {
97
+ gpio_init (gpio );
98
+ s_InitializedMask |= (1 << gpio );
99
+ }
100
+
101
+ if (arg [0 ] == 'd' && value [0 ] == 'I' )
102
+ {
103
+ gpio_set_pulls (gpio , true, false);
104
+ gpio_set_dir (gpio , GPIO_IN );
105
+ }
106
+ else
107
+ {
108
+ gpio_set_pulls (gpio , false, false);
109
+ gpio_set_dir (gpio , GPIO_OUT );
110
+
111
+ if (arg [0 ] == 'v' )
112
+ gpio_put (gpio , value [0 ] == '1' );
113
+ }
114
+ }
115
+
116
+ return true;
117
+ }
118
+ }
119
+
120
+ return false;
121
+ }
122
+
56
123
57
124
static void main_task (__unused void * params )
58
125
{
@@ -83,8 +150,9 @@ static void main_task(__unused void *params)
83
150
dhcp_server_init (& dhcp_server , & netif -> ip_addr , & netif -> netmask , settings -> domain_name );
84
151
dns_server_init (netif -> ip_addr .addr , settings -> secondary_address , settings -> hostname , settings -> domain_name );
85
152
http_server_instance server = http_server_create (settings -> hostname , settings -> domain_name , 4 , 4096 );
86
- static http_zone zone ;
87
- http_server_add_zone (server , & zone , "" , do_retrieve_file , NULL );
153
+ static http_zone zone1 , zone2 ;
154
+ http_server_add_zone (server , & zone1 , "" , do_retrieve_file , NULL );
155
+ http_server_add_zone (server , & zone2 , "/api" , do_handle_api_call , NULL );
88
156
vTaskDelete (NULL );
89
157
}
90
158
@@ -96,8 +164,8 @@ void debug_printf(const char *format, ...)
96
164
va_start (args , format );
97
165
xSemaphoreTake (s_PrintfSemaphore , portMAX_DELAY );
98
166
vprintf (format , args );
99
- xSemaphoreGive (s_PrintfSemaphore );
100
167
va_end (args );
168
+ xSemaphoreGive (s_PrintfSemaphore );
101
169
}
102
170
103
171
void debug_write (const void * data , int size )
0 commit comments