32 #include <BluetoothAPIs.h> 41 DEFINE_GUID(ASAM_XCP_ON_BT_GUID, 0xDC3CCEDC, 0xF7DE, 0x56E8, 0x87, 0x6F, 0x78, 0x1C, 0x07, 0x3C, 0x9B, 0x77);
44 SOCKADDR_BTH XcpTl_LocalBtAddress;
46 static void PrintBthAddr(SOCKADDR_BTH *addr);
48 void XcpTl_Init(
void) {
50 GUID Xcp_ServiceID = ASAM_XCP_ON_BT_GUID;
54 ZeroMemory(&service,
sizeof(service));
55 ZeroMemory(&csAddr,
sizeof(csAddr));
56 ZeroMemory(&XcpTl_LocalBtAddress,
sizeof(XcpTl_LocalBtAddress));
59 XcpTl_Connection.socketType = SOCK_STREAM;
61 if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) {
62 XcpHw_ErrorMsg(
"XcpTl_Init:WSAStartup()", WSAGetLastError());
65 XcpTl_Connection.boundSocket = socket(AF_BTH, SOCK_STREAM, BTHPROTO_RFCOMM);
66 if (XcpTl_Connection.boundSocket == INVALID_SOCKET) {
67 XcpHw_ErrorMsg(
"XcpTl_Init::socket()", WSAGetLastError());
72 XcpTl_LocalBtAddress.addressFamily = AF_BTH;
73 XcpTl_LocalBtAddress.btAddr = 0;
74 XcpTl_LocalBtAddress.serviceClassId = GUID_NULL;
75 XcpTl_LocalBtAddress.port = BT_PORT_ANY;
77 if (bind(XcpTl_Connection.boundSocket, (
struct sockaddr *)&XcpTl_LocalBtAddress,
sizeof(SOCKADDR_BTH)) == SOCKET_ERROR) {
78 XcpHw_ErrorMsg(
"XcpTl_Init::bind()", WSAGetLastError());
90 int size =
sizeof(SOCKADDR_BTH);
92 if (getsockname(XcpTl_Connection.boundSocket, (
struct sockaddr *)&XcpTl_LocalBtAddress, &size) == SOCKET_ERROR) {
93 XcpHw_ErrorMsg(
"XcpTl_Init::getsockname()", WSAGetLastError());
97 if (listen(XcpTl_Connection.boundSocket, 1) == SOCKET_ERROR) {
98 XcpHw_ErrorMsg(
"XcpTl_Init::listen()", WSAGetLastError());
102 service.dwSize =
sizeof(service);
103 service.lpszServiceInstanceName =
"XCPonBth";
104 service.lpszComment =
"Measure and calibrate with XCP on Bluetooth -- Have fun :-)";
105 service.lpServiceClassId = &Xcp_ServiceID;
106 service.dwNumberOfCsAddrs = 1;
107 service.dwNameSpace = NS_BTH;
108 csAddr.LocalAddr.iSockaddrLength =
sizeof(SOCKADDR_BTH);
109 csAddr.LocalAddr.lpSockaddr = (
struct sockaddr *)&XcpTl_LocalBtAddress;
110 csAddr.iSocketType = SOCK_STREAM;
111 csAddr.iProtocol = BTHPROTO_RFCOMM;
112 service.lpcsaBuffer = &csAddr;
114 if (WSASetService(&service, RNRSERVICE_REGISTER, 0) == SOCKET_ERROR) {
115 XcpHw_ErrorMsg(
"XcpTl_Init::WSASetService()", WSAGetLastError());
119 void XcpTl_DeInit(
void) {
120 closesocket(XcpTl_Connection.boundSocket);
124 void XcpTl_Send(uint8_t
const *buf, uint16_t len) {
125 XCP_TL_ENTER_CRITICAL();
127 if (send(XcpTl_Connection.connectedSocket, (
char const *)buf, len, 0) == SOCKET_ERROR) {
128 XcpHw_ErrorMsg(
"XcpTl_Send:send()", WSAGetLastError());
129 closesocket(XcpTl_Connection.connectedSocket);
131 XCP_TL_LEAVE_CRITICAL();
134 void XcpTl_PrintBtDetails(
void) {
135 printf(
"XCPonBth -- Listening on ");
136 PrintBthAddr(&XcpTl_LocalBtAddress);
137 printf(
" channel %u\n\r", (
unsigned int)XcpTl_LocalBtAddress.port);
140 static void PrintBthAddr(SOCKADDR_BTH *addr) {
141 uint8_t mac[6] = {0};
144 mac[0] = (addr->btAddr >> 40) & 0xff;
145 mac[1] = (addr->btAddr >> 32) & 0xff;
146 mac[2] = (addr->btAddr >> 24) & 0xff;
147 mac[3] = (addr->btAddr >> 16) & 0xff;
148 mac[4] = (addr->btAddr >> 8) & 0xff;
149 mac[5] = (addr->btAddr) & 0xff;
151 for (idx = 0; idx < 6; ++idx) {
152 printf(
"%02X", mac[idx]);