编辑代码

#include <stdio.h>
#include <stdint.h>

#define ADDR_HOST 0x3E
#define ADDR_POWER 0x20


typedef enum power_ack_t
{
  POWER_NACK = 0x00,
  POWER_ACK = 0x01
}power_ack_t;

typedef enum power_func_t
{
  FUNC_CONTROL = 0x01,
  FUNC_SETTING = 0x03,
  FUNC_REPORT_RESP = 0x10,
  FUNC_CONTROL_RESP = 0x11,
  FUNC_SETTING_RESP = 0x13
}power_func_t;

typedef union power_id_t
{
    uint32_t code;
    struct {
      uint32_t dest: 6;
      uint32_t r0: 1;
      uint32_t ack: 1;
      uint32_t src: 6;
      uint32_t r1: 1;
      uint32_t subpolo: 1;
      uint32_t subcnt: 2;
      uint32_t r3: 6;
      uint32_t func: 5;
      uint32_t r4: 3;
    };
}power_id_t;

void power_set_id(power_id_t *id, power_func_t func, uint8_t src, power_ack_t ack, uint8_t dest)
{
  id->code = ((func & 0x1F) << 24) | ((src & 0x3F) << 8) | ((ack & 0x01) << 7) | (dest & 0x3F);
}

void power_print_float(float data)
{
  uint8_t * p = (uint8_t *)&data;
  printf("%02x %02x %02x %02x ", 0x06, 0, 0x90, 0x11);
  printf("%02x %02x %02x %02x\n", p[3], p[2], p[1], p[0]);
}

void power_print_cmd(uint8_t data)
{
  printf("%02x 00 00 00 00 00 00 00\n", data);
}

void power_print_u32(uint32_t data)
{
  uint8_t * p = (uint8_t *)&data;
  printf("%02x %02x %02x %02x ", 0x04, 0, 0x91, 0x50);
  printf("%02x %02x %02x %02x\n", p[3], p[2], p[1], p[0]);
}

power_id_t power_id = {0};


int main(int argc, char const *argv[])
{
  power_set_id(&power_id, FUNC_SETTING, ADDR_HOST, POWER_ACK, ADDR_POWER);
  printf("0x%08x\n", power_id.code);
  power_print_float(108);

  power_set_id(&power_id, FUNC_CONTROL, ADDR_HOST, POWER_ACK, ADDR_POWER);
  printf("0x%08x\n", power_id.code);
  power_print_cmd(0x50);

  power_set_id(&power_id, FUNC_CONTROL, ADDR_HOST, POWER_ACK, ADDR_POWER);
  printf("0x%08x\n", power_id.code);
  power_print_cmd(0x52);

  power_set_id(&power_id, FUNC_SETTING, ADDR_HOST, POWER_ACK, ADDR_POWER);
  printf("0x%08x\n", power_id.code);
  power_print_u32(0xaa55aa55);
  return 0;
}