Subversion Repositories f9daq

Rev

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");
}