00001
00006
00007
00008
00009
00010
00011
00012
00013
00014 #ifndef _LIBSTDF_DTC_H
00015 #define _LIBSTDF_DTC_H
00016
00017 #include <libstdf.h>
00018
00019 extern void __byte_order_change(int, int, byte_t*, int) attribute_hidden;
00020 #define __byte_order_to_host(b,p,l) __byte_order_change(b, __STDF_HOST_BYTE_ORDER, p, l)
00021 #define __byte_order_to_src(b,p,l) __byte_order_change(__STDF_HOST_BYTE_ORDER, b, p, l)
00022 #define _stdf_byte_order_to_host(f,v,l) __byte_order_to_host(f->byte_order, (byte_t*)(v), l)
00023 #define _stdf_byte_order_to_src(f,v,l) __byte_order_to_src(f->byte_order, (byte_t*)(v), l)
00024
00025 #ifdef STDF_VER3
00026 extern void _stdf_read_dtc_Cx(stdf_file*, dtc_Cn*, int) attribute_hidden;
00027 #endif
00028 extern void _stdf_read_dtc_Cn(stdf_file*, dtc_Cn*) attribute_hidden;
00029 extern void _stdf_read_dtc_Bn(stdf_file*, dtc_Bn*) attribute_hidden;
00030 extern void _stdf_read_dtc_Dn(stdf_file*, dtc_Dn*) attribute_hidden;
00031
00032 extern void _stdf_read_dtc_C1(stdf_file*, dtc_C1*) attribute_hidden;
00033 extern void _stdf_read_dtc_B1(stdf_file*, dtc_B1*) attribute_hidden;
00034 extern void _stdf_read_dtc_N1(stdf_file*, dtc_N1*) attribute_hidden;
00035 extern void _stdf_read_dtc_U1(stdf_file*, dtc_U1*) attribute_hidden;
00036 extern void _stdf_read_dtc_U2(stdf_file*, dtc_U2*) attribute_hidden;
00037 extern void _stdf_read_dtc_U4(stdf_file*, dtc_U4*) attribute_hidden;
00038 extern void _stdf_read_dtc_I1(stdf_file*, dtc_I1*) attribute_hidden;
00039 extern void _stdf_read_dtc_I2(stdf_file*, dtc_I2*) attribute_hidden;
00040 extern void _stdf_read_dtc_I4(stdf_file*, dtc_I4*) attribute_hidden;
00041 extern void _stdf_read_dtc_R4(stdf_file*, dtc_R4*) attribute_hidden;
00042 extern void _stdf_read_dtc_R8(stdf_file*, dtc_R8*) attribute_hidden;
00043
00044 extern void _stdf_read_dtc_xN1(stdf_file*, dtc_xN1*, dtc_U2) attribute_hidden;
00045 extern void _stdf_read_dtc_xU1(stdf_file*, dtc_xU1*, dtc_U2) attribute_hidden;
00046 extern void _stdf_read_dtc_xU2(stdf_file*, dtc_xU2*, dtc_U2) attribute_hidden;
00047 extern void _stdf_read_dtc_xR4(stdf_file*, dtc_xR4*, dtc_U2) attribute_hidden;
00048 #define free_x(x) if (x) free(x)
00049 #define free_xU1(x) free_x(x)
00050 #define free_xU2(x) free_x(x)
00051 #define free_xR4(x) free_x(x)
00052
00053 extern void _stdf_read_dtc_xCn(stdf_file*, dtc_xCn*, dtc_U2) attribute_hidden;
00054 extern void free_xCn(dtc_xCn, dtc_U2) attribute_hidden;
00055
00056 extern void _stdf_read_dtc_Vn(stdf_file*, dtc_Vn*, dtc_U2) attribute_hidden;
00057 extern void free_Vn(dtc_Vn, dtc_U2) attribute_hidden;
00058
00059 #define _stdf_write_byte(file, byte) \
00060 *file->_write_pos++ = byte
00061 #define _stdf_write_nbytes(file, inbuf, cnt) \
00062 do { \
00063 memcpy(file->_write_pos, inbuf, cnt); \
00064 file->_write_pos += cnt; \
00065 } while (0)
00066 #define _stdf_write_cnt_nbytes(file, inbuf, cnt) \
00067 do { \
00068 _stdf_write_byte(file, cnt); \
00069 if (cnt) _stdf_write_nbytes(file, inbuf, cnt); \
00070 } while (0)
00071
00072 #define __stdf_write_even_bytes(type, file, bytes, even) \
00073 do { \
00074 type mapme = bytes; \
00075 _stdf_byte_order_to_src(file, &mapme, even); \
00076 uchar *map = (uchar*)&mapme; \
00077 _stdf_write_nbytes(file, map, even); \
00078 } while (0)
00079 #define _stdf_write_2bytes(file, bytes) __stdf_write_even_bytes(uint16_t, file, bytes, 2)
00080 #define _stdf_write_4bytes(file, bytes) __stdf_write_even_bytes(uint32_t, file, bytes, 4)
00081 #define _stdf_write_4bytes_float(file, bytes) __stdf_write_even_bytes(float, file, bytes, 4)
00082 #define _stdf_write_8bytes_float(file, bytes) __stdf_write_even_bytes(double, file, bytes, 8)
00083
00084 #define _stdf_write_dtc_C1(file, C1) _stdf_write_byte(file, C1)
00085 #define _stdf_write_dtc_B1(file, B1) _stdf_write_byte(file, B1)
00086 #define _stdf_write_dtc_N1(file, N1) _stdf_write_byte(file, N1)
00087 #define _stdf_write_dtc_U1(file, U1) _stdf_write_byte(file, U1)
00088 #define _stdf_write_dtc_I1(file, I1) _stdf_write_byte(file, I1)
00089
00090 #define _stdf_write_dtc_U2(file, U2) _stdf_write_2bytes(file, U2)
00091 #define _stdf_write_dtc_I2(file, I2) _stdf_write_2bytes(file, I2)
00092
00093 #define _stdf_write_dtc_U4(file, U4) _stdf_write_4bytes(file, U4)
00094 #define _stdf_write_dtc_I4(file, I4) _stdf_write_4bytes(file, I4)
00095 #define _stdf_write_dtc_R4(file, R4) _stdf_write_4bytes_float(file, R4)
00096
00097 #define _stdf_write_dtc_R8(file, R8) _stdf_write_8bytes_float(file, R8)
00098
00099 #define _stdf_qwrite_dtc_header(file, REC_LEN, REC_TYP, REC_SUB) \
00100 do { \
00101 _stdf_write_dtc_U2(file, REC_LEN); \
00102 _stdf_write_dtc_U1(file, REC_TYP); \
00103 _stdf_write_dtc_U1(file, REC_SUB); \
00104 } while (0)
00105 #define _stdf_write_dtc_header(file, header) \
00106 _stdf_qwrite_dtc_header(file, (header)->REC_LEN, (header)->REC_TYP, (header)->REC_SUB)
00107
00108 #define _stdf_write_dtc_Cn(file, Cn) _stdf_write_cnt_nbytes(file, Cn+1, (Cn ? *Cn : 0))
00109 #define _stdf_write_dtc_Bn(file, Bn) _stdf_write_dtc_Cn(file, Bn)
00110 #define _stdf_write_dtc_Dn(file, Dn) \
00111 do { \
00112 if (Dn) { \
00113 dtc_U2 cnt = *((dtc_U2*)Dn); \
00114 _stdf_write_dtc_U2(file, cnt); \
00115 _stdf_write_nbytes(file, Dn+2, cnt); \
00116 } \
00117 } while (0)
00118
00119 #define _stdf_write_dtc_Vn(file, Vn, cnt) warnf("writing dtc_Vn is not implemented")
00120
00121 #define _stdf_write_dtc_x(file, x, cnt, func) \
00122 do { \
00123 dtc_U2 i; \
00124 for (i=0; i<cnt; ++i) \
00125 func(file, x[i]); \
00126 } while (0)
00127
00128 #define _stdf_write_dtc_xU1(file, xU1, cnt) _stdf_write_nbytes(file, xU1, cnt)
00129 #define _stdf_write_dtc_xU2(file, xU2, cnt) _stdf_write_dtc_x(file, xU2, cnt, _stdf_write_dtc_U2)
00130 #define _stdf_write_dtc_xN1(file, xN1, cnt) _stdf_write_nbytes(file, xN1, ((cnt/2)+(cnt%2)))
00131 #define _stdf_write_dtc_xR4(file, xR4, cnt) _stdf_write_dtc_x(file, xR4, cnt, _stdf_write_dtc_R4)
00132 #define _stdf_write_dtc_xCn(file, xCn, cnt) _stdf_write_dtc_x(file, xCn, cnt, _stdf_write_dtc_Cn)
00133 #define _stdf_write_dtc_xBn(file, xBn, cnt) _stdf_write_dtc_xCn(file, xBn, cnt)
00134
00135 #ifdef STDF_VER3
00136 #define _stdf_write_dtc_Cx(file, Cx, cnt) warnf("writing dtc_Cx is not implemented");
00137 #endif
00138
00139 #endif