Пример #1
0
// 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);
    }
}
Пример #2
0
// 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);
      }
  }
}
Пример #3
0
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;
            }
Пример #4
0
/*
 * 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;
            }