4

Pythonで使用するために変換する方法は?

以下のコードは、複雑にネストされた Union と Struct です。それを誤って Python に変換するのは非常に簡単です。

typedef struct {
    unsigned char       enable;
    unsigned short      x;
    unsigned short      y;
    unsigned char       local;
    unsigned char       em;
    unsigned char       tr;
    short               at;
    unsigned char       reserved[6];
} IRF_SPOT;


typedef union strSAVEDATA
{
    struct
    {
        uint32_t    crc;
        uint8_t     ver;
        uint8_t     id;
        uint8_t     baudrate;
        int16_t     level;
        uint16_t    span;
        uint8_t     tv;
        uint8_t     agc;
        uint8_t     invert;
        uint8_t     mirror;
        uint8_t     flip;
        uint8_t     colorbar;
        uint8_t     showinfo;
        uint8_t     indicator;
        uint8_t     unit;
        uint8_t     dhcp;
        uint8_t     color;
        uint8_t     alpha;
        uint8_t     zoom;
        uint8_t     sharp;
        uint8_t     noise;          // new
        uint16_t    nuc;
        uint32_t    ipaddr;
        uint32_t    netmask;
        uint32_t    gateway;
        uint32_t    dns;
        uint8_t     alarm1_func;    // new
        uint8_t     alarm1_cond;    // new
        uint16_t    alarm1_value;   // new
        uint8_t     alarm2_func;    // new
        uint8_t     alarm2_cond;    // new
        uint16_t    alarm2_value;   // new
        uint8_t     temp_mode;      // reserved
        uint8_t     down_filter;    // reserved
        uint8_t     show_center;
        uint8_t     show_spot;
        uint8_t     show_correction;
        uint8_t     show_isotherm;
        uint8_t     reserved1[70];      
        uint8_t     limit9;
        uint8_t     enable_high;    
        uint8_t     correction;
        uint8_t     emissivity;
        uint8_t     transmission;
        int16_t atmosphere;
        struct {
            uint8_t     enable;
            uint16_t    x;
            uint16_t    y;
            uint8_t     local;
            uint8_t     em;
            uint8_t     tr;
            int16_t at;
            uint8_t     reserved[6];
        } spot[10];
        struct {
            uint8_t     enable;
            uint32_t    seed_color;
            int16_t     top;
            int16_t     bottom;
            uint8_t     reserved[3];
        } iso[3];
    };
    char padding[512];
} IRF_SAVEDATA_T;



typedef struct 
{
    unsigned short* ir_image;   
    DWORD image_buffer_size;    
    LPBYTE lpNextData;          
    DWORD dwSize;               
    DWORD dwPosition;           
    IRF_MESSAGE_TYPE_T      msg_type;
    IRF_SAVEDATA_T          save_data;      
    unsigned int            fw_ver;         
    unsigned short PMSGTYPE;    // Primary Message Type Code
    unsigned short RCODE;       // Response Code
} IRF_IR_CAM_DATA_T;

これはとても複雑です。これを使用してインターネット カメラを接続しますが、カメラがメッセージに応答しません。正しい変換方法を教えてください。

私のPythonコード:

class spot(Structure):
    _fields_ = [
            ('enable',wintypes.c_uint8),
            ('x',wintypes.c_uint16),
            ('y',wintypes.c_uint16),
            ('local',wintypes.c_uint8),
            ('em',wintypes.c_uint8),
            ('tr',wintypes.c_uint8),
            ('at',wintypes.c_uint16),
            ('reserved',wintypes.c_uint8*6)
            ]

class iso(Structure):
    _fields_ = [
            ('enable',wintypes.c_uint8),
            ('seed_color',wintypes.c_uint32),
            ('top',wintypes.c_int16),
            ('bottom',wintypes.c_int16),
            ('reserved',wintypes.c_uint8)
            ]
class strSAVEDATA(Structure):
    _fields_ = [
            ('crc',wintypes.c_uint32),
            ('ver',wintypes.c_uint8),
            ('id',wintypes.c_uint8),
            ('baudrate',wintypes.c_uint8),
            ('level',wintypes.c_int16),
            ('span',wintypes.c_uint16),
            ('tv',wintypes.c_uint8),
            ('agc',wintypes.c_uint8),
            ('invert',wintypes.c_uint8),
            ('mirror',wintypes.c_uint8),
            ('flip',wintypes.c_uint8),
            ('colorbar',wintypes.c_uint8),
            ('showinfo',wintypes.c_uint8),
            ('indicator',wintypes.c_uint8),
            ('unit',wintypes.c_uint8),
            ('dhcp',wintypes.c_uint8),
            ('color',wintypes.c_uint8),
            ('alpha',wintypes.c_uint8),
            ('zoon',wintypes.c_uint8),
            ('sharp',wintypes.c_uint8),
            ('noise',wintypes.c_uint8),
            ('nuc',wintypes.c_uint16),
            ('ipaddr',wintypes.c_uint32),
            ('netmask',wintypes.c_uint32),
            ('gatway',wintypes.c_uint32),
            ('dns',wintypes.c_uint32),
            ('alarm1_func',wintypes.c_uint8),
            ('alarm1_cond',wintypes.c_uint8),
            ('alarm1_value',wintypes.c_uint16),
            ('alarm2_func',wintypes.c_uint8),
            ('alarm2_cond',wintypes.c_uint8),
            ('alarm2_value',wintypes.c_uint16),  
            ('temp_mode',wintypes.c_uint8),
            ('down_filter',wintypes.c_uint8),
            ('show_center',wintypes.c_uint8),
            ('show_spot',wintypes.c_uint8),
            ('show_correction',wintypes.c_uint8),
            ('show_isotherm',wintypes.c_uint8),
            ('reserved1',wintypes.c_uint8*70),
            ('limit9',wintypes.c_uint8),
            ('enable_high',wintypes.c_uint8),
            ('correction',wintypes.c_uint8),
            ('emissivity;',wintypes.c_uint8),
            ('transmission',wintypes.c_uint8),
            ('atmosphere',wintypes.c_int16),
            ('spot',spot*10),
            ('iso',iso*3)
            ]    

class IRF_SAVEDATA_T(Union):
    _fields_ = [
            ('strSAVEDATA',strSAVEDATA),
            ('padding',wintypes.c_uint8*512)
            ]

class IRF_IR_CAM_DATA_T(Structure):
    _fields_ = [
            ('ir_image',POINTER(wintypes.USHORT)),
            ('image_buffer_size',wintypes.DWORD),
            ('lpNextData',POINTER(wintypes.BYTE)),
            ('dwSize',wintypes.DWORD),
            ('dwPosition',wintypes.DWORD),
            ('msg_type',IRF_MESSAGE_TYPE_T),
            ('save_data',IRF_SAVEDATA_T),
            ('fw_ver',wintypes.UINT),
            ('PMSGTYPE',wintypes.USHORT),
            ('RCODE',wintypes.USHORT)                
            ]
4

0 に答える 0