Blame |
Last modification |
View Log
| RSS feed
#include "sender.h"
#define binary(bit) strtol(bit,NULL,2)
void SenderInit
(){};
void SenderClose
(){};
//------------------------------------------------------------------------------------------------------
// Send 1 data & address by UDP
void Senderudp_send
( unsigned int address
, int data
){// data: send only 1 data length
SiTCPRBCPskeleton
(0xff, 0x80, address
, 0x1, address
);
SiTCPsndData
[0] = data
;
memcpy(SiTCPsndBuf
+sizeof(struct bcp_header
), SiTCPsndData
, sizeof SiTCPsndData
);
int len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP send error");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(1);
}
//------------------------------------------------------------------------------------------------------
// Recv 1 data & address by UDP
int Senderudp_recv
( unsigned int address
, int data
){// data: send only 1 data length
SiTCPRBCPskeleton
(0xff, 0xc0, address
, 0x1, address
);
int len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP recv error");
printf("exit(1);!!!\n");
}
int rd_data
= 0;
rd_data
= SiTCPrcvRBCP_ACK
(1);
// std::cout << rd_data << std::endl;
return rd_data
;
}
//------------------------------------------------------------------------------------------------------
// Send 1 packet data & address by UDP
void SenderRBCPpacket_send
( unsigned int address
,
unsigned char length
, int* data
){
printf("enter packet function\n");
SiTCPRBCPskeleton
(0xff, 0x80, address
, length
, address
);
for(int i
=0; i
<256; ++i
){
SiTCPsndData
[i
] = data
[i
];// <- sndData: 0~255
}
memcpy(SiTCPsndBuf
+sizeof(struct bcp_header
), SiTCPsndData
, sizeof SiTCPsndData
);
int len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, sizeof SiTCPsndData
+ sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP send error");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(0);
}
//------------------------------------------------------------------------------------------------------
// Recv 1 packet data & address by UDP
void SenderRBCPpacket_recv
( unsigned int address
,
unsigned char length
, int* data
){
printf("enter packet function\n");
SiTCPRBCPskeleton
(0xff, 0xc0, address
, length
, address
);
int len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, sizeof SiTCPsndData
+ sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP recv error");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(1);
}
//------------------------------------------------------------------------------------------------------
//=============== multi packet sending method ===============
void SenderRBCP_multi_packet_send
( unsigned int address
,
unsigned int total_length
, int* data
){
unsigned int total_packet
= ((total_length
/255)+1)*2;
unsigned int packetNo
= 0;
printf("------------------ RBCP : register access ------------------\n");
printf("\n");
printf("Start sending packet data");
for(packetNo
=0; packetNo
<total_packet
; ++packetNo
){
// SiTCPrcvRBCP_ACK(0);
SiTCPRBCPskeleton
(0xff, 0x80, address
+(packetNo
*255), 0xff, address
+(packetNo
*255));
for(int i
=0; i
<255; ++i
){
SiTCPsndData
[i
] = data
[i
+(packetNo
*255)];// <- sndData: 0~255
}
memcpy(SiTCPsndBuf
+sizeof(struct bcp_header
), SiTCPsndData
, sizeof SiTCPsndData
);
int len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, sizeof SiTCPsndData
+ sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("Send DAQ Start Signal");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(0);
// std::cout << SiTCPrcvRBCP_ACK(1) << std::endl;
printf(".");
}
printf("Done!!!\n");
printf("\n");
printf("Number of sent packets = %d\n", packetNo
);
printf("\n");
}
//------------------------------------------------------------------------------------------------------
//--------------------EASIROC MADC sender---------------------------
int Senderread_madc
( int data
){// data: send only 1 data length
//Set ADC ch to FPGA reg
SiTCPRBCPskeleton
(0xff, 0x80, 0x00000012, 0x1, 0x00000012);
SiTCPsndData
[0] = data
;
memcpy(SiTCPsndBuf
+sizeof(struct bcp_header
), SiTCPsndData
, sizeof SiTCPsndData
);
int len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP Send error");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(1);
SiTCPRBCPskeleton
(0xff, 0x80, 0x0000001f, 0x1, 0x0000001f);
SiTCPsndData
[0] = 1;
memcpy(SiTCPsndBuf
+sizeof(struct bcp_header
), SiTCPsndData
, sizeof SiTCPsndData
);
len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP Send error");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(1);
//Sleep(20000);//wait ADC ch change
Sleep
(2000);//wait ADC ch change
//start Read ADC
SiTCPRBCPskeleton
(0xff, 0x80, 0x00000012, 0x1, 0x00000012);
SiTCPsndData
[0] = 240;
memcpy(SiTCPsndBuf
+sizeof(struct bcp_header
), SiTCPsndData
, sizeof SiTCPsndData
);
len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP Send error");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(1);
SiTCPRBCPskeleton
(0xff, 0x80, 0x0000001f, 0x1, 0x0000001f);
SiTCPsndData
[0] = 0;
memcpy(SiTCPsndBuf
+sizeof(struct bcp_header
), SiTCPsndData
, sizeof SiTCPsndData
);
len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP Send error");
printf("exit(1);!!!\n");
}
SiTCPrcvRBCP_ACK
(1);
//read data
int rd_data
= 0;
int rd_data1
= 0;
int rd_data2
= 0;
SiTCPRBCPskeleton
(0xff, 0xc0, 0x00000004, 0x1, 0x00000004);
len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP recv error");
printf("exit(1);!!!\n");
}
rd_data1
= SiTCPrcvRBCP_ACK
(1);
// std::cout << rd_data << std::endl;
SiTCPRBCPskeleton
(0xff, 0xc0, 0x00000005, 0x1, 0x00000005);
len
= 0;
len
= sendto
(SiTCPGetUDPSock
(), SiTCPsndBuf
, 1 + sizeof(struct bcp_header
), 0,
(struct sockaddr
*)&SiTCPudpAddr
, sizeof(SiTCPudpAddr
));//important!
if(len
< 0){
perror("UDP recv error");
printf("exit(1);!!!\n");
}
rd_data2
= SiTCPrcvRBCP_ACK
(1);
// std::cout << rd_data << std::endl;
rd_data
= rd_data1
*256 + rd_data2
;
return rd_data
;
}
//------------------------------------------------------------------------------------------------------
void Senderclear_all
(){
unsigned char address
;
int data
;
//int nbyte;
// Send register clear
address
= 0x00;
data
= 0x0;
Senderudp_send
(address
, data
);
printf("Clear all registers in FPGA.\n");
}