123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <time.h>
- #include <sys/time.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "esp_sleep.h"
- #include "esp_log.h"
- #include "driver/uart.h"
- #include "driver/rtc_io.h"
- #include "esp_intr_alloc.h"
- #include "esp_attr.h"
- #include "driver/timer.h"
- #include <stddef.h>
- #include "esp_intr_alloc.h"
- #include "receiver.h"
- #include "transceiver.h"
- #include "rxTimer.h"
- #include "Sensors/ClasOSensor.h"
- #include "Sensors/proovesmartSensor.h"
- #include "Sensors/nexa.h"
- #include "Sensors/oregon.h"
- #include "led.h"
- #include "udp_client.h"
- #include "wifi.h"
- uint32_t dataArr[1000];
- uint32_t dataArrIdx = 0;
- static int convertToSignedTemp(unsigned int value)
- {
- //int signValue;
- return ( (value >> 11) == 0 )? value : ((-1 ^ 0xFFF) | value);
- }
- void receiverTask(void *pvParameter)
- {
- ESP_LOGI("RX", "Receiver task starting.");
- uint32_t width;
- char dataStr[UDP_QUEUE_OBJ_LENGTH];
- while (1) {
- while( xQueueReceive( rxQueue, &width, portMAX_DELAY ) == pdTRUE ) {
- dataArr[dataArrIdx++] = width;
- if( dataArrIdx == 1000 ) dataArrIdx=0;
- // Receive the Clas Ohlsson Sensors
- int64_t data = nextPulseClasOSensor(width);
- if( data != -1 ) {
- int value = convertToSignedTemp( data & 0xFFF );
- unsigned char id = (data>>12) & 0x007;
- ESP_LOGI("RX", "ClasO: <TR%08llX> %u %d",data,id, value);
- sprintf(dataStr,"<TR%08llX>\n",data);
- #ifdef WIFI_ENABLED
- sendUDPMessage(dataStr);
- #endif
- }
- // Receive the Telldus / Proovesmart Sensors
- data = nextPulseProovesmartSensor(width);
- if( data != -1 ) {
- const int value = (data & 0x00FFF0000) >> 16;
- const int id = (data & 0xFF0000000) >> 28;
- ESP_LOGI("RX", "Proove: <Tr%016llX> ID:%d %d",data,id,value);
- sprintf(dataStr,"<Tr%016llX>\n",data);
- #ifdef WIFI_ENABLED
- sendUDPMessage(dataStr);
- #endif
- }
- // Receive the NEXA Sensors
- data = nextPulseNEXA(width);
- if( data != -1 ) {
- ESP_LOGI("RX", "NEXA: <NR%08llX>",data);
- sprintf(dataStr,"<NR%08llX>\n",data);
- #ifdef WIFI_ENABLED
- sendUDPMessage(dataStr);
- #endif
- }
- // Receive the Oregon (Rain) Sensor
- char *ch_data_p = nextPulseOregonSensor(width);
- if( ch_data_p != NULL ) {
- // Nibbles 17..12 = Total Rain = LSD is 0.001 inch (0,0254 mm)
-
- // 0 1 2 3 4 5 6 7 8 9 Rate Total
- // RR2A1904CE 0000 601600 70 = 001.660 0000 001660
- // RR2A1904CE 2001 702000 60 = 002.070 = 0,41 0120 002070
- // RR2A1904CE 0001 902400 A0 = 002.490 = 0,42 002490
- // Sequence: 563412
- // 1 cubic mm of water = 0,001 gram
- // 7 grams of water = 7000 mm2
- // Area of the rain sensor is 7697.69 sq.mm. It flips every ~7grams of water
- // Every flip is therefore 0.90936402542048 mm or rain
- // The value that is reported is in 1/1000 cubic inches of water.
- // Multiply with 16387 / 1000 to get cm2
- double total = 100 * (ch_data_p[4+12]-'0') +
- 10 * (ch_data_p[5+12]-'0') +
- (ch_data_p[2+12]-'0') +
- 0.1 * (ch_data_p[3+12]-'0') +
- 0.01 * (ch_data_p[0+12]-'0') +
- 0.001 * (ch_data_p[1+12]-'0');
- total = (total * 16387) / 1000;
- char ch_data[21];
- strncpy(ch_data,ch_data_p, sizeof(ch_data));
- ESP_LOGI("RX", "OREGON: <RR%s> %6.4f cm2", ch_data, total );
- Oregon_ResetDecoder();
- }
- }
- }
- vTaskDelete(NULL);
- }
- void initReceiver() {
- Oregon_ResetDecoder();
- ClasO_ResetDecoder();
- ProovesmartSensor_ResetDecoder();
-
- ESP_LOGI("RX", "Receiver has been initialized.");
- xTaskCreatePinnedToCore(&receiverTask, "receiverTask", 8192, NULL, tskIDLE_PRIORITY + 5, NULL, 0);
- }
|