void extrelay_handler(void* request, void* response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { static uint8_t status; status = relay_toggle(); PRINTF("Relay [%d]\n", status); REST.set_header_content_type(response, REST.type.TEXT_PLAIN); snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%d",status); REST.set_response_payload(response, buffer, strlen((char *)buffer)); }
static int command_manage_relay (client_t *client, int response) { const char *relay_mount, *enable; const char *msg; relay_server *relay; xmlDocPtr doc; xmlNodePtr node; COMMAND_OPTIONAL (client, "relay", relay_mount); COMMAND_OPTIONAL (client, "enable", enable); if (relay_mount == NULL || enable == NULL) { doc = xmlNewDoc (XMLSTR("1.0")); node = xmlNewDocNode (doc, NULL, XMLSTR("icerelaystats"), NULL); xmlDocSetRootElement(doc, node); thread_mutex_lock (&(config_locks()->relay_lock)); for (relay = global.relays; relay; relay=relay->next) add_relay_xmlnode (node, relay, 0); for (relay = global.master_relays; relay; relay=relay->next) add_relay_xmlnode (node, relay, 1); thread_mutex_unlock (&(config_locks()->relay_lock)); return admin_send_response (doc, client, response, "managerelays.xsl"); } thread_mutex_lock (&(config_locks()->relay_lock)); relay = slave_find_relay (global.relays, relay_mount); if (relay == NULL) relay = slave_find_relay (global.master_relays, relay_mount); msg = "no such relay"; if (relay) { int running = atoi (enable) ? 1 : 0; if (relay->running == running) msg = "relay is left unchanged"; else if (relay_toggle (relay)) msg = "relay has been enabled"; else msg = "relay has been disabled"; } thread_mutex_unlock (&(config_locks()->relay_lock)); doc = xmlNewDoc(XMLSTR("1.0")); node = xmlNewDocNode(doc, NULL, XMLSTR("iceresponse"), NULL); xmlDocSetRootElement(doc, node); xmlNewChild(node, NULL, XMLSTR("message"), XMLSTR(msg)); xmlNewChild(node, NULL, XMLSTR("return"), XMLSTR("1")); return admin_send_response(doc, client, response, "response.xsl"); }
PROCESS_THREAD(test_process, ev, data) { PROCESS_BEGIN(); /* Selects P6.7 as control pin of the relay module */ relay_enable(7); while(1) { etimer_set(&et, RELAY_INTERVAL); PROCESS_WAIT_EVENT_UNTIL(etimer_expired(&et)); status = relay_toggle(); PRINTF("Relay [%d]\n", status); } PROCESS_END(); }
static void res_post_handler(void *request, void *response, uint8_t *buffer, uint16_t preferred_size, int32_t *offset) { lightBulbStatus = relay_toggle(); unsigned int accept = -1; REST.get_header_accept(request, &accept); if(accept == -1 || accept == REST.type.TEXT_PLAIN) { REST.set_header_content_type(response, REST.type.TEXT_PLAIN); snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%u;", lightBulbStatus); REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer)); } else if(accept == REST.type.APPLICATION_XML) { REST.set_header_content_type(response, REST.type.APPLICATION_XML); snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "<Light_state =\"%u\"/>", lightBulbStatus); REST.set_response_payload(response, buffer, strlen((char *)buffer)); } else if(accept == REST.type.APPLICATION_JSON) { REST.set_header_content_type(response, REST.type.APPLICATION_JSON); snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'Light':{'State':%u}}", lightBulbStatus); REST.set_response_payload(response, buffer, strlen((char *)buffer)); } else { REST.set_response_status(response, REST.status.NOT_ACCEPTABLE); const char *msg = "Supporting content-types text/plain, application/xml, and application/json"; REST.set_response_payload(response, msg, strlen(msg)); } }
static PT_THREAD(handle_input(struct httpd_state *s)) { int found = 0; PSOCK_BEGIN(&s->sin); PSOCK_READTO(&s->sin, ISO_space); if(httpd_strncmp(s->inputbuf, httpd_get, 4) == 0) { PSOCK_READTO(&s->sin, ISO_space); if(s->inputbuf[0] != ISO_slash) { PSOCK_CLOSE_EXIT(&s->sin); } if(s->inputbuf[1] == ISO_space) { httpd_strcpy(s->filename, httpd_indexfn); } else { s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); /* Look for ?, if found strip file name and send any following text to the LCD */ uint8_t i; for (i=0;i<sizeof(s->inputbuf);i++) { if (s->inputbuf[i]=='?') { if (i<sizeof(s->filename)) s->filename[i]=0; // s->inputbuf[i]=0; //allow multiple beeps with multiple ?'s } if (s->inputbuf[i]==0) break; } } } else if(httpd_strncmp(s->inputbuf, httpd_post, 5) == 0) { PSOCK_READTO(&s->sin, ISO_space); if(s->inputbuf[0] != ISO_slash) { PSOCK_CLOSE_EXIT(&s->sin); } if (httpd_strncmp(&s->inputbuf[1], httpd_config_file, sizeof(httpd_config_file)-1) == 0) { s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); /* Look for ?, if found strip file name*/ uint8_t i; for (i=0;i<sizeof(s->inputbuf);i++) { if (s->inputbuf[i]=='?') { if (i<sizeof(s->filename)) s->filename[i]=0; } if (s->inputbuf[i]==0) break; } //parse config data found = 0; //look for the combination "\r\n\r\n"; the post data follow thereafter while (!found) { PSOCK_READTO(&s->sin, ISO_nl); PSOCK_READTO(&s->sin, ISO_cr); if (PSOCK_DATALEN(&s->sin) == 1) { PSOCK_READTO(&s->sin, ISO_nl); found=1; } } PSOCK_READTO(&s->sin, ISO_equal); //check for domain_name PSOCK_READTO(&s->sin, ISO_amper); if(s->inputbuf[0] != ISO_amper) { char tmp[nvm_size(domain_name)]; memset(tmp, 0, sizeof (tmp)); memcpy(tmp, s->inputbuf, PSOCK_DATALEN(&s->sin) - 1); nvm_write_block(domain_name, tmp, sizeof(tmp)); } PSOCK_READTO(&s->sin, ISO_equal); //check for relay_default_state PSOCK_READTO(&s->sin, ISO_amper); if(s->inputbuf[0] == '1') set_relay_default(0); else if (s->inputbuf[0] == '0') set_relay_default(1); #if S0_ENABLE PSOCK_READTO(&s->sin, ISO_equal); //check for s0 calibration value PSOCK_READTO(&s->sin, ISO_amper); if(s->inputbuf[0] != ISO_amper) { metering_set_s0_calibration((uint16_t)atoi(s->inputbuf)); } #endif } else if (httpd_strncmp(&s->inputbuf[1], httpd_socket_status_file, sizeof(httpd_socket_status_file)-1) == 0) { // toggle button has been pressed s->inputbuf[PSOCK_DATALEN(&s->sin) - 1] = 0; strncpy(s->filename, &s->inputbuf[0], sizeof(s->filename)); /* Look for ?, if found strip file name*/ uint8_t i; for (i=0;i<sizeof(s->inputbuf);i++) { if (s->inputbuf[i]=='?') { if (i<sizeof(s->filename)) s->filename[i]=0; } if (s->inputbuf[i]==0) break; } relay_toggle(); } else { PSOCK_CLOSE_EXIT(&s->sin); } } else { PSOCK_CLOSE_EXIT(&s->sin); } webserver_log_file(&uip_conn->ripaddr, s->filename); s->state = (s->state == STATE_ERROR) ? STATE_OUTPUT_ERROR : STATE_OUTPUT; while(1) { PSOCK_READTO(&s->sin, ISO_nl); if(httpd_strncmp(s->inputbuf, httpd_ref, 8) == 0) { s->inputbuf[PSOCK_DATALEN(&s->sin) - 2] = 0; petsciiconv_topetscii(s->inputbuf, PSOCK_DATALEN(&s->sin) - 2); webserver_log(s->inputbuf); } } PSOCK_END(&s->sin); }