// Copyright 2015 by Thorsten von Eicken, see LICENSE.txt #include #include "config.h" #include "serled.h" #include "cgiwifi.h" //===== "CONN" LED status indication static ETSTimer ledTimer; // Set the LED on or off, respecting the defined polarity static void ICACHE_FLASH_ATTR setLed(int on) { int8_t pin = flashConfig.conn_led_pin; if (pin < 0) return; // disabled // LED is active-low if (on) { gpio_output_set(0, (1<reverse); char buf[2000]; // http header int hdrLen = os_sprintf(buf, "PUT /api/feed?api_key=%s HTTP/1.0\r\n" "Content-Type: application/json\r\n" "Content-Length: XXXXX\r\n\r\n", GS_API_KEY); // http body int dataLen = os_sprintf(buf+hdrLen, "[{\"compId\":\"%s\", \"streamId\":\"%s\", \"data\":%d}]", GS_COMP_ID, GS_STREAM, rssiLast); // hackish way to fill in the content-length os_sprintf(buf+hdrLen-9, "%5d", dataLen); buf[hdrLen-4] = '\r'; // send it off if (espconn_sent(conn, (uint8*)buf, hdrLen+dataLen) == ESPCONN_OK) { os_printf("RSSI sent rssi=%d\n", rssiLast); os_printf("RSSI sent <<%s>>\n", buf); } } // Sent callback static void ICACHE_FLASH_ATTR rssiSentCb(void *arg) { struct espconn *conn = (struct espconn *)arg; os_printf("RSSI sent CB (%p %p)\n", arg, conn->reverse); } // Recv callback static void ICACHE_FLASH_ATTR rssiRecvCb(void *arg, char *data, uint16_t len) { struct espconn *conn = (struct espconn *)arg; os_printf("RSSI recv CB (%p %p)\n", arg, conn->reverse); data[len] = 0; // hack!!! os_printf("GOT %d: <<%s>>\n", len, data); espconn_disconnect(conn); } // Disconnect callback static void ICACHE_FLASH_ATTR rssiDisconCb(void *arg) { struct espconn *conn = (struct espconn *)arg; os_printf("RSSI disconnect CB (%p %p)\n", arg, conn->reverse); rssiSendState = 0; } // Connection reset callback static void ICACHE_FLASH_ATTR rssiResetCb(void *arg, sint8 err) { struct espconn *conn = (struct espconn *)arg; os_printf("RSSI reset CB (%p %p) err=%d\n", arg, conn->reverse, err); rssiSendState = 0; } // Timer callback to send an RSSI update to a monitoring system static void ICACHE_FLASH_ATTR rssiTimerCb(void *v) { sint8 rssi = wifi_station_get_rssi(); if (rssi >= 0) return; // not connected or other error rssiLast = rssi; if (rssiSendState > 0) return; // not done with previous rssi report rssiConn.type = ESPCONN_TCP; rssiConn.state = ESPCONN_NONE; rssiConn.proto.tcp = &rssiTcp; rssiTcp.remote_port = 80; rssiTcp.remote_ip[0] = 173; rssiTcp.remote_ip[1] = 236; rssiTcp.remote_ip[2] = 12; rssiTcp.remote_ip[3] = 163; espconn_regist_connectcb(&rssiConn, rssiConnectCb); espconn_regist_reconcb(&rssiConn, rssiResetCb); espconn_regist_sentcb(&rssiConn, rssiSentCb); espconn_regist_recvcb(&rssiConn, rssiRecvCb); espconn_regist_disconcb(&rssiConn, rssiDisconCb); rssiConn.reverse = (void *)0xdeadf00d; os_printf("RSSI connect (%p)\n", &rssiConn); if (espconn_connect(&rssiConn) == ESPCONN_OK) { rssiSendState++; } } //===== Init status stuff void ICACHE_FLASH_ATTR statusInit(void) { if (flashConfig.conn_led_pin >= 0) { makeGpio(flashConfig.conn_led_pin); setLed(1); } os_printf("CONN led=%d\n", flashConfig.conn_led_pin); os_timer_disarm(&ledTimer); os_timer_setfn(&ledTimer, ledTimerCb, NULL); os_timer_arm(&ledTimer, 2000, 0); os_timer_disarm(&rssiTimer); os_timer_setfn(&rssiTimer, rssiTimerCb, NULL); os_timer_arm(&rssiTimer, RSSI_INTERVAL, 1); // recurring timer }