示例#1
0
uint8_t DS18B20::selectNext() {
    if (oneWireSearch(SEARCH_ROM)) {
        return select(searchAddress);
    }

    return 0;
}
示例#2
0
uint8_t DS18B20::selectNextAlarm() {
    if (oneWireSearch(ALARM_SEARCH)) {
        return select(searchAddress);
    }

    return 0;
}
示例#3
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;
	}
}