// Keep conversions going on for each sensor on each onewire bus void operate_onewire_temp_measurement(void) { if (conv_complete) { switch (bus_to_address) { case 0: if (bus0_conv_initiated) read_DS18xxx(0); bus0_conv_initiated = issue_convert_on_bus(0); bus_to_address = 0; break; } // Reset the conversion timer and set the complete flag so we // can wait for conversion time expiry on the next bus reset_timeout(TEMP_CONV_TIMER); conv_complete = FALSE; } else { conv_complete = timeout_occured(TEMP_CONV_TIMER, DS18x20_CONV_TIME / NR_OF_OW_BUSES); } }
// Keep conversions going on for each sensor on each onewire bus void operate_onewire_temp_measurement(void) { { unsigned char register_testmask; if (conv_complete) { // Not very nice to use a bitmap but we need to spare bytes for the stack to keep things safe:( // This bitmap is used to keep track of register conversion initiation information register_testmask = 0x01 << register_to_address; // Evaluate side effect: Only read until read is succesful if (register_conv_initiated & register_testmask) read_DS18xxx(register_to_address); register_conv_initiated &= ~register_testmask; if (issue_convert_for_device(register_to_address)) register_conv_initiated |= register_testmask; // Reset the conversion timer and set the complete flag so we // can wait for conversion time expiry of the next device reset_timeout(TEMP_CONV_TIMER); conv_complete = FALSE; if(++register_to_address == NR_OF_TEMP_SENSORS) register_to_address = 0; } else { conv_complete = timeout_occured(TEMP_CONV_TIMER, (DS18x20_CONV_TIME / NR_OF_TEMP_SENSORS) + 50); } } }
void operate_device(void) { // Create messaging variables unsigned char response_opcode = RESPONSE_UNDEFINED, p, pinmask; bool got_message; // The main loop of the device while (TRUE) { // Operate main device functions operate_onewire_temp_measurement(); got_message = get_device_message(); #if 0 /* * Watch communication activity on bus and reset the device outputs * if no communication is seen whithin timeout */ if (!got_message) { if (timeout_occured(BUS_COMMUNICATION_WATCHDOG_TIMER, BUS_COMMUNICATION_TIMEOUT_MS)) { // Re-initialize the device - shut every output down device_specific_init(); init_device_comm(HOST_ID, COMM_SPEED_9600_H); // Reset the timer reset_timeout(BUS_COMMUNICATION_WATCHDOG_TIMER); } } else { reset_timeout(BUS_COMMUNICATION_WATCHDOG_TIMER); } #endif // Take care of messaging if (got_message && !process_generic_messages()) { // Set response opcode to undefined to ensure issue identification response_opcode = RESPONSE_UNDEFINED; switch (message_buffer.content[OPCODE]) { case SET_REGISTER: // p holds register to write p = message_buffer.content[PARAMETER_START]; // Preset response opcode to success response_opcode = COMMAND_SUCCESS; if(p>0 && p<=3) { /* Address 1: External temp sensor * Address 2: Living temp sensor * Address 3: Upstairs temp sensor */ // Read-only temp registers - command fails response_opcode = COMMAND_FAIL; } else if( p<=5 ) { /* Address 4: Living floor valve * Address 5: Upstairs floor valve */ pinmask = register_pinmask_map[p-1]; if (onewire_reset(pinmask)) { // If the value read and the value got on the bus do not equal then toggle the value of the DS2405 switch if((message_buffer.content[PARAMETER_START + 1] > 0) != ReadDS2405(register_rom_map[p-1], pinmask)) { if(onewire_reset(pinmask)) { send_onewire_rom_commands(p-1); } else { response_opcode = COMMAND_FAIL; } } } else { response_opcode = COMMAND_FAIL; } } else { /* Any other write addresses fail */ response_opcode = COMMAND_FAIL; } message_buffer.index = PARAMETER_START-1; break; case READ_REGISTER: // p holds register to write p = message_buffer.content[PARAMETER_START]; // Preset response opcode to success response_opcode = COMMAND_SUCCESS; if(p>0 && p<=3) { /* Address 1: External temp sensor * Address 2: Living temp sensor * Address 3: Upstairs temp sensor */ message_buffer.content[PARAMETER_START] = temperatures[p - 1] & 0x00ff; message_buffer.content[PARAMETER_START + 1] = (temperatures[p- 1] >> 8) & 0x00ff; message_buffer.index = PARAMETER_START + 1; } else if( p<=5 ) { /* Address 4: Living floor valve * Address 5: Upstairs floor valve */ pinmask = register_pinmask_map[p-1]; if (onewire_reset(pinmask)) { message_buffer.content[PARAMETER_START] = ReadDS2405(register_rom_map[p-1], pinmask); message_buffer.index = PARAMETER_START; } else { response_opcode = COMMAND_FAIL; message_buffer.index = PARAMETER_START-1; } } else if (p == 6){ /* Test address to read a single onewire device's ROM code */ pinmask = register_pinmask_map[0]; onewire_reset(pinmask); onewire_write_byte(CMD_READ_ROM, pinmask); for (p = 0; p < 8; p++) message_buffer.content[PARAMETER_START+p] = onewire_read_byte(pinmask); message_buffer.index = PARAMETER_START+7; } else { /* Any other read addresses fail */ response_opcode = COMMAND_FAIL; message_buffer.index = PARAMETER_START-1; } break; default: response_opcode = COMMAND_FAIL; break; }
/* * To send a PING: * {ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,07,01,01,36,05,37,cf} * * To identify Register 4 (expected response as per the above identification data): * {ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,08,01,01,36,02,04,2c,d8} * * To identify Register 1 (expected response as per the above identification data): * {ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,08,01,01,36,02,01,99,32} * * To Read Register 1 * {ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,08,01,01,36,01,01,8f,66} * * To Write Register 3 (PWM), with low pin 2-2 sec * {ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,ff,0b,01,01,35,00,03,14,14,00,04,d8} * */ void operate_device(void) { // Messaging variables unsigned char response_opcode = RESPONSE_UNDEFINED, p; bool got_message; // The main loop of the device while (TRUE) { // Operate main device functions operate_onewire_temp_measurement(); got_message = get_device_message(); /* * Watch communication activity on bus and reset the device outputs * if no communication is seen whithin timeout */ if (!got_message) { if (timeout_occured(BUS_COMMUNICATION_WATCHDOG_TIMER, BUS_COMMUNICATION_TIMEOUT_MS)) { // Re-initialize the device - shut every output down device_specific_init_phase1(); init_device_comm(HOST_ID, COMM_SPEED_9600_H); device_specific_init_phase2(); // Reset the timer reset_timeout(BUS_COMMUNICATION_WATCHDOG_TIMER); } } else { reset_timeout(BUS_COMMUNICATION_WATCHDOG_TIMER); } // Take care of messaging if (got_message && !process_generic_messages()) { // Set response opcode to undefined to filter response opcode programming issues response_opcode = RESPONSE_UNDEFINED; switch (message_buffer.content[OPCODE]) { case SET_REGISTER: // p holds register to write p = message_buffer.content[PARAMETER_START]; // Preset response opcode to success response_opcode = COMMAND_SUCCESS; if ( p>0 && p<=4 ) { /* Address 1: HW temp sensor * Address 2: Basement temp sensor * Address 3: Return temp sensor * Address 4: Hidr Shift temp sensor */ response_opcode = COMMAND_FAIL; } else if( p <= 12 ) { /* * Address 5: Buffertop valve - Contact 2 * Address 6: Return valve - Contact 3 * Address 7: Radiator pump - Contact 4 * Address 8: Floor pump - Contact 5 * Address 9: Hidraulic Shifter pump - Contact 6 * Address 10: HW pump - Contact 7 * Address 11: Basement radiator valve Contact 8 * Address 12: Basement floor valve - Contact 9 */ write_extender(p-5, message_buffer.content[PARAMETER_START + 1] > 0); } else if(p == 13) { /* Address 13: Heater relay P3_5 - Heater contact */ HEATER_RELAY_PIN = message_buffer.content[PARAMETER_START + 1] > 0; } else if(p <= 15) { /* * Temp wipers - expected data format: * Byte 1 & 2 - 9 bits of data holdiong the desired wiper setting * Byte 3 - bool flag - is volatile * Address 14: HW Wiper * Address 15: Heating Wiper */ if (!write_wiper( (message_buffer.content[PARAMETER_START+1] << 8) | message_buffer.content[PARAMETER_START+2] , message_buffer.content[PARAMETER_START + 3]>0, p == 14 ? WIPER_HW : WIPER_HEAT)) response_opcode = COMMAND_FAIL; } else { /* Any other address fails */ response_opcode = COMMAND_FAIL; } message_buffer.index = PARAMETER_START-1; break; case READ_REGISTER: // p holds register to read p = message_buffer.content[PARAMETER_START]; // Preset response opcode to success response_opcode = COMMAND_SUCCESS; if ( p>0 && p<=4 ) { /* Address 1: HW temp sensor * Address 2: Basement temp sensor * Address 3: Return temp sensor * Address 4: Hidr Shift temp sensor */ message_buffer.content[PARAMETER_START] = temperatures[p - 1] & 0x00ff; message_buffer.content[PARAMETER_START + 1] = (temperatures[p- 1] >> 8) & 0x00ff; message_buffer.index = PARAMETER_START + 1; } else if( p <= 12 ) { /* * Address 5: Buffertop valve - Contact 2 * Address 6: Return valve - Contact 3 * Address 7: Radiator pump - Contact 4 * Address 8: Floor pump - Contact 5 * Address 9: Hidraulic Shifter pump - Contact 6 * Address 10: HW pump - Contact 7 * Address 11: Basement radiator valve Contact 8 * Address 12: Basement floor valve - Contact 9 */ message_buffer.content[PARAMETER_START] = get_extender_value(p-5); message_buffer.index = PARAMETER_START; } else if(p == 13) { /* Address 13: Heater relay P3_5 - Heater contact */ message_buffer.content[PARAMETER_START] = HEATER_RELAY_PIN; message_buffer.index = PARAMETER_START; } else if(p <= 15) { /* * Temp wipers - expected data format: * Byte 1 - bool flag - is volatile * Address 14: HW Wiper * Address 15: Heating Wiper */ read_wiper((unsigned int*)(message_buffer.content+PARAMETER_START), message_buffer.content[PARAMETER_START+1]>0, p == 14 ? WIPER_HW : WIPER_HEAT); message_buffer.index = PARAMETER_START+1; } else if(p == 16) { /* Test address to read rom on onewire bus - a single device should be connected to the bus in this case */ onewire_reset(0x04); onewire_write_byte(CMD_READ_ROM, 0x04); for (p = 0; p < 8; p++) message_buffer.content[PARAMETER_START+p] = onewire_read_byte(0x04); message_buffer.index = PARAMETER_START+7; } else { response_opcode = COMMAND_FAIL; message_buffer.index = PARAMETER_START-1; } break; // Any other message code fails default: response_opcode = COMMAND_FAIL; message_buffer.index = PARAMETER_START-1; break; }