#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;
}