uint8_t DS18B20::selectNext() { if (oneWireSearch(SEARCH_ROM)) { return select(searchAddress); } return 0; }
uint8_t DS18B20::selectNextAlarm() { if (oneWireSearch(ALARM_SEARCH)) { return select(searchAddress); } return 0; }
void cmd(clunet_msg* m){ switch(m->command){ case CLUNET_COMMAND_SWITCH: if (m->data[0] == 0xFF){ //info request if (m->size == 1){ switchResponse(m->src_address); } }else{ if (m->size == 2){ switch(m->data[0]){ case 0x00: case 0x01: case 0x02: switchExecute(m->data[1], m->data[0]); switchResponse(m->src_address); break; case 0x03: for (char i=0; i<8; i++){ switchExecute(i+1, bit(m->data[1], i)); } switchResponse(m->src_address); break; } } } break; case CLUNET_COMMAND_ONEWIRE_SEARCH: if (m->size == 0){ owi_num_devices = oneWireSearch(devices); clunet_send_fairy(m->src_address, CLUNET_PRIORITY_INFO, CLUNET_COMMAND_ONEWIRE_INFO, (char*)&devices, owi_num_devices * sizeof(OWI_device)); } break; case CLUNET_COMMAND_TEMPERATURE: if (m->size >= 1){ switch(m->data[0]){ case 1: //1-wire термометры //проверяем, что запрашиваются все 1-wire термометры //и если запрашиваются они - то выполняем как для data[0] = 0 if (m->size != 2 || m->data[1] != 0){ break; } case 0: { //все устройства //теперь не делаем поиск устройств при каждом запросе, //а используем массив полученный при первом обращении //или при вызове команды oneWireSearch //т.к. вызывает зависания устройства if (!owi_num_devices){ owi_num_devices = oneWireSearch(devices); } temperatureResponse(m->src_address, devices, owi_num_devices); } break; case 2: //запрос по серийнику if (m->size == 10 && m->data[1] == 0){ //запрос по 1-wire temperatureResponse(m->src_address, (OWI_device*)&m->data[2], 1); } break; } } break; // case CLUNET_COMMAND_DOOR_INFO: // if (m->src_address == DOORS_SENSOR_DEVICE_ID){ // if (m->size==1 && m->data[0] >=0){ // unsigned char doors_opened = m->data[0]>0; // signed char state = switchState(WARDROBE_LIGHT_RELAY_ID); // if (state >= 0 && state != doors_opened){ // switchExecute(WARDROBE_LIGHT_RELAY_ID, doors_opened); // switchResponse(CLUNET_BROADCAST_ADDRESS); // } // } // } // break; case CLUNET_COMMAND_HEATFLOOR: switch (m->size){ case 0x01: switch(m->data[0]){ case 0x00: case 0x01: heatfloor_on(m->data[0]); break; case 0xFF: // запрос текущего состояния всех каналов heatfloor_states_response(m->src_address, heatfloor_state_info()); break; case 0xFE: //запрос текущих режимов по всем каналам heatfloor_modes_response(m->src_address, heatfloor_modes_info()); break; case 0xF0 ... 0xF9: //запрос параметров программы (0-9) heatfloor_program_response(m->src_address, heatfloor_program_info(m->data[0])); //case 0xFE: //setup ds18b20 (temporary) // DS18B20_SetDeviceAccuracy(OWI_BUS, &HEATING_FLOOR_CHANNEL_0_SENSOR_1W_ID, 3); // break; } break; default: heatfloor_command(m->data, m->size); //применение параметров break; } break; case CLUNET_COMMAND_TIME: { //задержка добавлена специально в связи с багой в супрадин, //которую на имеющихся ресурсах решить невозможно: //при одновременном поступлении сообщений как по сети (от супрадин-клиентов) так и по клюнет //клюнет сообщения затираются сетевыми в буфере клюнет (так как прослушиваются все входящие сообщения в том числе и свои (sniff)) //Решение видится лишь в добавлении стека входящих сообщений по клюнет, но для этого совершенно нет свободной ОЗУ. //Следует отметить, что в рельности сообщения в сети clunet ходят, их лишь не видно через supradin //_delay_ms(100); //send heatfloor current time for debug heatfloor_datetime* dt = heatfloor_systime(); char hd[7] = {0, 1, 1, dt->hours, dt->minutes, dt->seconds, dt->day_of_week}; clunet_send_fairy(m->src_address, CLUNET_PRIORITY_INFO, CLUNET_COMMAND_TIME_INFO, &hd[0], sizeof(hd)); } break; case CLUNET_COMMAND_TIME_INFO: if (heatfloor_systime_async_response != NULL){ if (m->size == 7 && m->src_address == CLUNET_SUPRADIN_ADDRESS){ heatfloor_systime_async_response(m->data[5], m->data[4], m->data[3], m->data[6]); heatfloor_systime_async_response = NULL; } } break; } }