1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
#include "busdevice.h"
#include "pcserialport.h"
#include <string.h>
#define BD_NONE 0
#define BD_RS 1
#define BD_FTDI 2
//how much bytes available in transmit buffer
#define TANSMIT_BUFFER_LENGTH 128
unsigned long SMBusBaudrate=SM_BAUDRATE; //the next opened port (with smOpenBus) will be opened with the PBS defined here (default 460800 BPS)
typedef struct _SMBusDevice
{
//common
smint8 bdType;//bus device type (such as rs232 or ftdi lib or mcu UART etc). 1=rs232 lib
smbool opened;
SM_STATUS cumulativeSmStatus;
//used for rs232 lib only
int comPort;
smuint8 txBuffer[TANSMIT_BUFFER_LENGTH];
smint32 txBufferUsed;//how many bytes in buffer currently
//used for FTDI lib only
} SMBusDevice;
//init on first open
smbool bdInitialized=smfalse;
SMBusDevice BusDevice[SM_MAX_BUSES];
//init device struct table
void smBDinit()
{
int i;
for(i=0;i<SM_MAX_BUSES;i++)
{
BusDevice[i].bdType=BD_NONE;
BusDevice[i].opened=smfalse;
BusDevice[i].txBufferUsed=0;
}
bdInitialized=smtrue;
}
//ie "COM1" "VSD2USB"
//return -1 if fails, otherwise handle number
smbusdevicehandle smBDOpen( const char *devicename )
{
int handle;
//true on first call
if(bdInitialized==smfalse)
smBDinit();
//find free handle
for(handle=0;handle<SM_MAX_BUSES;handle++)
{
if(BusDevice[handle].opened==smfalse) break;//choose this
}
//all handles in use
if(handle>=SM_MAX_BUSES) return -1;
if(strncmp(devicename,"COM",3) == 0 || strncmp(devicename,"/dev/tty",8) == 0) //use rs232 lib
{
BusDevice[handle].comPort=serialPortOpen( devicename, SMBusBaudrate );
if( BusDevice[handle].comPort == -1 )
{
return -1; //failed to open
}
BusDevice[handle].bdType=BD_RS;
BusDevice[handle].txBufferUsed=0;
}
else//no other bus types supproted yet
{
return -1;
}
//success
BusDevice[handle].cumulativeSmStatus=0;
BusDevice[handle].opened=smtrue;
return handle;
}
smbool smIsBDHandleOpen( const smbusdevicehandle handle )
{
if(handle<0) return smfalse;
if(handle>=SM_MAX_BUSES) return smfalse;
return BusDevice[handle].opened;
}
//return true if ok
smbool smBDClose( const smbusdevicehandle handle )
{
//check if handle valid & open
if( smIsBDHandleOpen(handle)==smfalse ) return smfalse;
if( BusDevice[handle].bdType==BD_RS )
{
serialPortClose( BusDevice[handle].comPort );
BusDevice[handle].opened=smfalse;
return smtrue;
}
return smfalse;
}
//write one byte to buffer and send later with smBDTransmit()
//returns true on success
smbool smBDWrite(const smbusdevicehandle handle, const smuint8 byte )
{
//check if handle valid & open
if( smIsBDHandleOpen(handle)==smfalse ) return smfalse;
if( BusDevice[handle].bdType==BD_RS )
{
if(BusDevice[handle].txBufferUsed<TANSMIT_BUFFER_LENGTH)
{
//append to buffer
BusDevice[handle].txBuffer[BusDevice[handle].txBufferUsed]=byte;
BusDevice[handle].txBufferUsed++;
return smtrue;
}
else
return smfalse;
}
return smfalse;
}
smbool smBDTransmit(const smbusdevicehandle handle)
{
//check if handle valid & open
if( smIsBDHandleOpen(handle)==smfalse ) return smfalse;
if( BusDevice[handle].bdType==BD_RS )
{
if(serialPortWriteBuffer(BusDevice[handle].comPort,BusDevice[handle].txBuffer, BusDevice[handle].txBufferUsed)==BusDevice[handle].txBufferUsed)
{
BusDevice[handle].txBufferUsed=0;
return smtrue;
}
else
{
BusDevice[handle].txBufferUsed=0;
return smfalse;
}
}
return smfalse;
}
//read one byte from bus. if byte not immediately available, block return up to SM_READ_TIMEOUT millisecs to wait data
//returns true if byte read sucessfully
smbool smBDRead( const smbusdevicehandle handle, smuint8 *byte )
{
//check if handle valid & open
if( smIsBDHandleOpen(handle)==smfalse ) return smfalse;
if( BusDevice[handle].bdType==BD_RS )
{
int n;
n=serialPortRead(BusDevice[handle].comPort, byte, 1);
if( n!=1 ) return smfalse;
else return smtrue;
}
return smfalse;
}
|