Ejemplo n.º 1
0
void massive_cancel(void)
{
  int count;

  for (count=0;count<10;count++)
   send_short(CAN_CHR);
}
Ejemplo n.º 2
0
int receiver_driven_start(int mode)
{
    int attempts = 0;
    char charbuf;
    char mode_letter;
    int cur_timer;

    switch (mode)
    {
      case X_MODEM_PROTOCOL:       mode_letter = NAK_CHR;
                                   break;
      case X_MODEM_CRC_PROTOCOL:   mode_letter = 'C';
                                   break;
      case X_MODEM_1K_PROTOCOL:    mode_letter = 'C';
                                   break;
      case Y_MODEM_PROTOCOL:       mode_letter = 'C';
                                   break;
    }
    while (attempts++ < 20)
    {
      delay(10);
      empty_inbuffer(tswitch);
      send_short(mode_letter);
      wait_for_xmit(tswitch,30);
      cur_timer = dans_counter;
      while (((dans_counter - cur_timer) < SMALL_TIMEOUT_TICKS) &&
       (!(charbuf=char_in_buf(tswitch)))) next_task();
      if (charbuf) return (0);
    }
    return (-1);
}
Ejemplo n.º 3
0
void send_packet(char *buffer, int length, char packetno, char checksum_type)
{
    if (length == 128) send_short(SOH_CHR);
     else send_short(STX_CHR);
    send_short(packetno);
    send_short(~packetno);
    send_buffer(buffer,length);
    switch (checksum_type)
    {
      case CRC_8: send_short(calc_8bit_checksum(buffer,length));
                  break;
      case CRC_16: send_integer(calc_crc_checksum((unsigned char *)buffer,length));
                   break;
    }
   wait_for_xmit(tswitch,30);
};
Ejemplo n.º 4
0
static void calculate_and_publish(capture_channel_definition_t *channel_definition)
  {
  // signal one more clock timeout
  channel_definition->publish_count++;
  if(channel_definition->publish_count >= channel_definition->can_channel.publish_frequency)
    {
    float result;
    // calculate the result first
    if(channel_definition->capture_count == 0)
      channel_definition->result = 0;
    else
      {
      // take the average value
      channel_definition->result /= channel_definition->capture_count;

      // the result is a count of 20mhz / 256 intervals
      channel_definition->result *= 0.0000128;

      // convert to a frequency
      channel_definition->result = 1 / channel_definition->result;
      }
    
    // otherwise use the parameter driven conversions.
    if(channel_definition->can_channel.scale != 1.0)
      channel_definition->result *= channel_definition->can_channel.scale;

    if(channel_definition->can_channel.offset != 0.0)
      channel_definition->result += channel_definition->can_channel.offset;

    // if we have a result processor then we just pass the filtered value to it to be processed.
    if(channel_definition->result_proc != 0)
      result = channel_definition->result_proc(channel_definition, channel_definition->result);
    else
      result = channel_definition->result;

    // we send the value (frequency) as a 16 bit number
    send_short(result, &(channel_definition->can_channel));

    // reset counter so that we calculate the next period
    channel_definition->result = -1;
    channel_definition->capture_count = 0;
    }
  }
Ejemplo n.º 5
0
int main()
{
	int class; //da trasformate in alt_u8 o 16 in base alle dimensioni
	int vote;
	int end_class;
	alt_u16 command[256];
	alt_u16 ack_cmd[3];
	alt_u32 tr_size;
	alt_u32 tr_size_count;
	alt_u8 q_size;
	alt_u32 n_packet;
	alt_u32 tr_val;
	alt_u64 addr; //verificare dimensione
	alt_u64 q_addr;
	alt_u32 q_val;
	alt_u32 i = 0;
	alt_u32 k = 0;
	alt_u8 k_val;
	alt_u16 n_dim;
	alt_u16 n_load;
	alt_u16 n_load_count;
	alt_u16 n_cell;
	alt_u16 n_cell_last;
	alt_u64 count = 0;
	alt_u16 cache_q_addr = 0;
	alt_dma_txchan txchan;
    alt_dma_rxchan rxchan;
    alt_u32 memptr = 0;
    alt_u8 empty0 = 0;
    alt_u8 empty1 = 0;
    alt_u8 overflow = 0;
	unsigned char ledvalue = 1;
    void* tx_data; /* pointer to data to send */
    void* rx_buffer; /* pointer to rx buffer */
	while(1)
	{
		command[0] = 0;
		recv_short(command, 8);
		//send back the ACK
		ack_cmd[0] = ACK;
		ack_cmd[1] = ACK;
		ack_cmd[2] = command[3];
		send_short(ack_cmd, 3);
		if(command[0] == FLUSH_COMM)
		{
			tr_size = 0;
			tr_size = command[1];
			tr_size = tr_size<<16;
			tr_size = tr_size | command[2];
			n_packet = 0;
			n_packet = command[3];
			n_packet = n_packet<<16;
			n_packet = n_packet | command[4];
			cache_q_addr = command[5];
			addr = 0;
			tr_size_count = 0;
			for(i = 0; i < n_packet;i++)
			{
				recv_short(command, 256);
				send_short(command, 256);
				for(k = 0;k < 127; k++)
				{
					if(tr_size_count < tr_size)
					{
						tr_size_count = tr_size_count + 1;
						tr_val = 0;
						tr_val = command[2+2*k];
						tr_val = tr_val<<16;
						tr_val = tr_val | command[3+2*k];
						IOWR_32DIRECT(SDRAM_CONTROLLER_BASE,addr,tr_val);
						addr = addr + 0x04;
					}
				}
			}
			ack_cmd[0] = ACK;
			ack_cmd[1] = ACK;
			ack_cmd[2] = command[3];
			send_short(ack_cmd, 3);
		}
		else if(command[0] == CLASS_CMD)
		{
			q_size = 0;
			q_size = command[1];
			q_size = q_size<<16;
			q_size = q_size | command[2];
			n_dim = 0;
			n_dim = command[3];
			k_val = 0;
			k_val = command[4];
			n_load = 0;
			n_load = command[5];
			n_cell = 0;
			n_cell = command[6];
			n_cell_last = 0;
			n_cell_last = command[7];
			for(i = 0; i < 1;i++)
			{
				recv_short(command, 256);
				send_short(command, 256);
			}
			q_addr = SDRAM_Q_ADDR_BASE;
			for(i = 0;i < q_size; i++)
			{
				q_val = 0;
				q_val = command[2*i];
				q_val = q_val<<16;
				q_val = q_val | command[1+2*i];
				IOWR_32DIRECT(SDRAM_CONTROLLER_BASE, q_addr, q_val);
				q_addr = q_addr + 0x04;
			}
		// set the number of dimension MAX = 256
		IOWR_32DIRECT(KNNCLASSCORE_BASE, STARTCLREG,0x00000000);
		IOWR_32DIRECT(BASEQADDR_0_BASE,0x00,cache_q_addr);
		IOWR_32DIRECT(SKIPADDRREG_0_BASE,0x00,(q_size+1)*4);
		IOWR_32DIRECT(NDIMREG_BASE,0x00,n_dim);
		// number of training val in each mem
		IOWR_32DIRECT(NTRREG_0_BASE,0x00,3);
		IOWR_32DIRECT(NTRREG_1_BASE,0x00,3);
		// k val
		IOWR_32DIRECT(KNNCLASSCORE_BASE,KVALREG,k_val);
		IOWR_32DIRECT(ENDTSETREG_0_BASE,0x00,0);
		IOWR_32DIRECT(ENDTSETREG_1_BASE,0x00,0);
		load_q_cache1 = 0;
		load_q_cache0 = 0;
		IOWR_32DIRECT(FULLREG_0_BASE,0x00,0x00000000);
		IOWR_32DIRECT(FULLREG_1_BASE,0x00,0x00000000);
		PERF_RESET(PERFORMANCE_COUNTER_0_BASE);
		PERF_START_MEASURING(PERFORMANCE_COUNTER_0_BASE);
		PERF_BEGIN(PERFORMANCE_COUNTER_0_BASE,1);
		IOWR_32DIRECT(KNNCLASSCORE_BASE, STARTCLREG,0x00000001);
		txchan = alt_dma_txchan_open("/dev/dma");
		rxchan = alt_dma_rxchan_open("/dev/dma");
		alt_dma_txchan_ioctl(txchan, ALT_DMA_SET_MODE_32, NULL);
		alt_dma_rxchan_ioctl(rxchan, ALT_DMA_SET_MODE_32, NULL);
		txrx_doneCache0 = 0;
		tx_data = (void*)(SDRAM_CONTROLLER_BASE+SDRAM_Q_ADDR_BASE); /* pointer to data to send */
		rx_buffer = (void*)(DMA_WRITE_MASTER_CACHE_0_BASE+cache_q_addr);//CUSTOM_RAM_0_BASE
		alt_dma_txchan_send (txchan,tx_data,q_size*4,NULL,NULL);
		alt_dma_rxchan_prepare (rxchan,rx_buffer,q_size*4, txrxDoneCache0,NULL);
		alt_dma_txchan_ioctl(txchan, ALT_DMA_SET_MODE_32, NULL);
		alt_dma_rxchan_ioctl(rxchan, ALT_DMA_SET_MODE_32, NULL);
		txrx_doneCache1 = 0;
		tx_data = (void*)(SDRAM_CONTROLLER_BASE+SDRAM_Q_ADDR_BASE); /* pointer to data to send */
		rx_buffer = (void*)(DMA_WRITE_MASTER_CACHE_1_BASE+cache_q_addr);//CUSTOM_RAM_0_BASE
		alt_dma_txchan_send (txchan,tx_data,q_size*4,NULL,NULL);
		alt_dma_rxchan_prepare (rxchan,rx_buffer,q_size*4, txrxDoneCache1,NULL);
		IOWR_ALTERA_AVALON_PIO_DATA(PIO_0_BASE, ledvalue);
		ledvalue++;
		n_load_count = 0;
		memptr = 0;
		IOWR_32DIRECT(KNNCLASSCORE_BASE,STARTCLREG,1); //modificato qui
		 //fill cache 0
		empty0 = IORD_32DIRECT(EMPTYREG_0_BASE,0x00);
		empty1 = IORD_32DIRECT(EMPTYREG_1_BASE,0x00);
		while(txrx_doneCache1==0 || txrx_doneCache1==0);
		while(n_load_count < n_load)
		{
			if(empty0 && (n_load_count < n_load) && txrx_doneCache0 ) // && !endmem0
			{
				IOWR_32DIRECT(FULLREG_0_BASE,0x00,0x00000000);
				IOWR_32DIRECT(ENDTSETREG_0_BASE,0x00,0);
				if(n_load_count == n_load-1)
					IOWR_32DIRECT(NTRREG_0_BASE, 0x00,n_cell_last/(4*(q_size+1)));
				else
					IOWR_32DIRECT(NTRREG_0_BASE, 0x00,n_cell/(4*(q_size+1)));
				txrx_doneCache0 = 0;
				alt_dma_txchan_ioctl(txchan, ALT_DMA_SET_MODE_32, NULL);
				alt_dma_rxchan_ioctl(rxchan, ALT_DMA_SET_MODE_32, NULL);
				tx_data = (void*)(SDRAM_CONTROLLER_BASE+memptr); /* pointer to data to send */
				rx_buffer = (void*)(DMA_WRITE_MASTER_CACHE_0_BASE);//CUSTOM_RAM_0_BASE
				if(n_load_count == n_load-1)
				{
					alt_dma_txchan_send (txchan,tx_data,n_cell_last,NULL,NULL);
					alt_dma_rxchan_prepare (rxchan,rx_buffer,n_cell_last, txrxDoneCache0,NULL);
				}
				else
				{
					alt_dma_txchan_send (txchan,tx_data,n_cell,NULL,NULL);
					alt_dma_rxchan_prepare (rxchan,rx_buffer,n_cell, txrxDoneCache0,NULL);
				}
				memptr = memptr + n_cell;
				n_load_count++;
				IOWR_32DIRECT(FULLREG_0_BASE,0x00,0x00000001);
			}

			if(empty1 && (n_load_count< n_load) && txrx_doneCache1) // && !endmem0
			{
				//fill cache 1
				IOWR_32DIRECT(FULLREG_1_BASE,0x00,0x00000000);
				IOWR_32DIRECT(ENDTSETREG_1_BASE,0x00,0); //era 1
				if(n_load_count == n_load-1)
					IOWR_32DIRECT(NTRREG_1_BASE, 0x00,n_cell_last/(4*(q_size+1)));
				else
					IOWR_32DIRECT(NTRREG_1_BASE, 0x00,n_cell/(4*(q_size+1)));
				alt_dma_txchan_ioctl(txchan, ALT_DMA_SET_MODE_32, NULL);
				alt_dma_rxchan_ioctl(rxchan, ALT_DMA_SET_MODE_32, NULL);
				txrx_doneCache1 = 0;
				tx_data = (void*)(SDRAM_CONTROLLER_BASE+memptr); /* pointer to data to send */
				rx_buffer = (void*)(DMA_WRITE_MASTER_CACHE_1_BASE);//CUSTOM_RAM_0_BASE
				if(n_load_count == n_load-1)
				{
					alt_dma_txchan_send (txchan,tx_data,n_cell_last,NULL,NULL);
					alt_dma_rxchan_prepare (rxchan,rx_buffer,n_cell_last, txrxDoneCache1,NULL);
				}
				else
				{
					alt_dma_txchan_send (txchan,tx_data,n_cell,NULL,NULL);
					alt_dma_rxchan_prepare (rxchan,rx_buffer,n_cell, txrxDoneCache1,NULL);
				}
				memptr = memptr + n_cell;
				n_load_count++;
				IOWR_32DIRECT(FULLREG_1_BASE,0x00,0x00000001);
			}
			empty0 = IORD_32DIRECT(EMPTYREG_0_BASE,0x00);
			empty1 = IORD_32DIRECT(EMPTYREG_1_BASE,0x00);
		}
		while(txrx_doneCache1==0 || txrx_doneCache1==0);
		//while(empty0==0 || empty1==0);
		IOWR_32DIRECT(ENDTSETREG_0_BASE,0x00,1); //era 1
		IOWR_32DIRECT(ENDTSETREG_1_BASE,0x00,1); //era 1
		end_class = 0;
		while (!end_class)
			end_class = IORD_32DIRECT(KNNCLASSCORE_BASE,ENDCLASSREG);
		alt_dma_txchan_close(txchan);
		alt_dma_rxchan_close(rxchan);
		PERF_END(PERFORMANCE_COUNTER_0_BASE,1);
		class =  IORD_32DIRECT(KNNCLASSCORE_BASE,CLREG);
		vote =  IORD_32DIRECT(KNNCLASSCORE_BASE,NVOTREG);
		count = perf_get_section_time(PERFORMANCE_COUNTER_0_BASE,1);
		overflow = IORD_32DIRECT(KNNCLASSCORE_BASE,OVERFLOWREG);
		command[0] = class;
		command[1] = vote;
		command[2] = count;
		count = count>>16;
		command[3] = count;
		count = count>>16;
		command[4] = count;
		count = count>>16;
		command[5] = count;
		command[6] = overflow;
		addr = 0;
		for(i=0; i < 16; i++)
		{
			command[7+i] =  IORD_32DIRECT(KNNCLASSCORE_BASE,addr);
			addr = addr + 0x04;
		}
		send_short(command, 23);
		}
	}
Ejemplo n.º 6
0
int receive_ymodem_protocol(char *filename, int mode, int *last_file)
{
  int result;
  int packetno = 0;
  int gotpacketno;
  char *buffer;
  FILE *fileptr = 0;
  unsigned long int curlength = 0;
  unsigned long int maxlength = 0;
  int flag = 1;
  int not_received;
  int not_got_mode_type = 1;
  int length;
  int attempts;
  int keep_packet;
  int ymodem_block0 = 1;
#ifdef DEBUG
  char s[80];
#endif

#ifdef DEBUG
  print_str_cr_to("Started protocol",0);
#endif
  buffer = g_malloc(MAX_PROTO_BUFFER_SIZE,"RECVYMDM");
  if (!buffer)
  {
    massive_cancel();
    return (-1);
  }
  wait_for_sending_state(SMALL_TIMEOUT_TICKS,0);
  empty_inbuffer(tswitch);
  while (flag)
  {
    not_received = 1;
    attempts = 0;
    while (not_received && (attempts++ < 20))
    {
      if (not_got_mode_type)
      {
        if (receiver_driven_start(mode))
        {
          massive_cancel();
          if (fileptr) g_fclose(fileptr);
          g_free(buffer);
          return (-1);
        }
      }
      result=recv_packet(buffer,&length,&gotpacketno,CRC_16);
      wait_for_sending_state(SMALL_TIMEOUT_TICKS,0);
      empty_inbuffer(tswitch);
#ifdef DEBUG
      sprintf(s,"Received packet %03d result %03d",gotpacketno,result);
      print_str_cr_to(s,0);
#endif
      switch (result)
      {
        case CAN_CHR: if (check_cancel())
                      {
                        massive_cancel();
                        if (fileptr) g_fclose(fileptr);
                        g_free(buffer);
                        return (-1);
                      }
                      break;
        case ACK_CHR: if (((unsigned char)gotpacketno) ==
                          ((unsigned char)last_packet(packetno)))
                      {
                        keep_packet = 0;
                        send_short(ACK_CHR);
                        not_received = 0;
                      } else
                      if (((unsigned char)gotpacketno) ==
                          ((unsigned char)packetno))
                      {
                        keep_packet = 1;
                        send_short(ACK_CHR);
                        not_received = 0;
                        not_got_mode_type = 0;
                      } else
                      send_short(NAK_CHR);
                      break;
        case NAK_CHR: if (!not_got_mode_type)
                      {
                        massive_cancel();
                        if (fileptr) g_fclose(fileptr);
                        g_free(buffer);
                        return (-1);
                      }
                      break;
        case EOT_CHR: flag = 0;
                      keep_packet = 0;
                      send_short(ACK_CHR);
                      not_received = 0;
                      break;
        case (-1):    if (!not_got_mode_type) send_short(NAK_CHR);
                      break;
      }
    }
    if (not_received)
    {
      massive_cancel();
      if (fileptr) g_fclose(fileptr);
      g_free(buffer);
      return (-1);
    }
    if (keep_packet)
    {
      if (ymodem_block0)
      {
        ymodem_block0 = 0;
        decode_ymodem_block0(buffer,filename,&maxlength);
#ifdef DEBUG
        sprintf(s,"Filename: %s length: %ld",filename,maxlength);
        print_str_cr_to(s,0);
#endif
        *last_file = !(*filename);
        if (*last_file) flag = 0;
        if (*filename)
        {
         if (proto_open_file(filename,&fileptr,"wb"))
          {
             g_free(buffer);
             massive_cancel();
             return (-1);
          }
        }
        not_got_mode_type = 1;
      } else
      {
        proto_write_buffer(fileptr,buffer,(int)
        ((maxlength-curlength)>(unsigned long int) length) ?
         (unsigned long int) length :
         (unsigned long int) (maxlength-curlength) );
        curlength += length;
      }
      packetno++;
    }
  }
  if (fileptr) g_fclose(fileptr);
  g_free(buffer);
  return (0);
}
Ejemplo n.º 7
0
int send_ymodem_protocol(char *filename, int mode)
{
  int result;
  int packetno = 0;
  int attempts;
  int crc_type;
  char *buffer;
  FILE *fileptr;
  long int curlength = 0;
  long int maxlength;
  int blocklength;
  int not_got_sensible;
  int not_sent;
  int ymodem_block0 = 1;
  int lastpacket = 0;
#ifdef DEBUG
  char s[80];
#endif

#ifdef DEBUG
  print_str_cr_to("Started protocol",0);
#endif
  result = sender_start(&crc_type);
  if ((result == -1) || (result == CAN_CHR))
  {
    massive_cancel();
    return (-1);
  }
#ifdef DEBUG
  print_str_cr_to("Received start",0);
#endif
  if (*filename)
  {
    if (proto_open_file(filename,&fileptr,"rb"))
    {
      massive_cancel();
      return (-1);
    }
  } else fileptr = 0;
#ifdef DEBUG
  print_str_cr_to("opened file",0);
#endif
  buffer = g_malloc(MAX_PROTO_BUFFER_SIZE,"SNDYMDM");
  if (!buffer)
  {
    massive_cancel();
    if (fileptr) g_fclose(fileptr);
    return (-1);
  }
  if (fileptr) maxlength = 128 + proto_file_length(fileptr);
   else maxlength = 128;
  while (!lastpacket)
  {
    if (curlength >= maxlength) lastpacket = 1;
    if (!lastpacket)
    {
      if (ymodem_block0)
      {
        create_ymodem_block0(buffer,filename,maxlength-128);
      } else proto_read_buffer(fileptr,buffer,1024,&blocklength);
    }
    not_sent = 1;
    attempts = 0;
    while ((not_sent) && (attempts++ < 10))
    {
      empty_inbuffer(tswitch);
#ifdef DEBUG
      if (lastpacket) print_str_cr_to("Last packet",0);
        else
        {
          sprintf(s,"Sending packet %03d",packetno);
          print_str_cr_to(s,0);
        }
#endif
      if (lastpacket) send_short(EOT_CHR);
       else
       {
        if (ymodem_block0)
        {
          send_packet(buffer,128,packetno,crc_type);
          if (!(*filename)) lastpacket = 1;
        }
         else
         send_packet(buffer,1024,packetno,crc_type);
       }
      not_got_sensible = 1;
      while (not_got_sensible)
      {
        result = time_char();
#ifdef DEBUG
        sprintf(s,"Received char %03d",result);
        print_str_cr_to(s,0);
#endif
        switch (result)
        {
          case (-1):    not_got_sensible = 0;
                        break;
          case ACK_CHR: not_sent = 0;
                        not_got_sensible = 0;
                        break;
          case NAK_CHR: not_got_sensible = 0;
                        break;
          case CAN_CHR: if (check_cancel())
                        {
                          massive_cancel();
                          if (fileptr) g_fclose(fileptr);
                          g_free(buffer);
                          return (-1);
                        }
                        not_got_sensible = 0;
                        break;
        }
      }
    }
    if (not_sent)
    {
        massive_cancel();
        g_free(buffer);
        if (fileptr) g_fclose(fileptr);
        return (-1);
    }
    if (!lastpacket)
    {
      if (ymodem_block0)
      {
        curlength += 128;
        ymodem_block0 = 0;
      } else curlength += 1024;
      packetno++;
    }
  }
  if (fileptr) g_fclose(fileptr);
  g_free(buffer);
  return 0;
}
Ejemplo n.º 8
0
void receive_xmodem_protocol(char *filename, int crc_type, int mode)
{
  int result;
  int packetno = 1;
  int gotpacketno;
  char *buffer;
  FILE *fileptr;
  long int curlength = 0;
  int flag = 1;
  int not_received;
  int not_got_mode_type = 1;
  int length;
  int attempts;
  int keep_packet;
#ifdef DEBUG
  char s[80];
#endif

#ifdef DEBUG
  print_str_cr_to("Started protocol",0);
#endif
  if (proto_open_file(filename,&fileptr,"wb"))
  {
    massive_cancel();
    return;
  }
  buffer = g_malloc(MAX_PROTO_BUFFER_SIZE,"RCVXMDM");
  if (!buffer)
  {
    massive_cancel();
    g_fclose(fileptr);
    return;
  }
#ifdef DEBUG
  print_str_cr_to("Opened file",0);
#endif
  wait_for_sending_state(SMALL_TIMEOUT_TICKS,0);
  empty_inbuffer(tswitch);
  while (flag)
  {
    not_received = 1;
    attempts = 0;
    while (not_received && (attempts++ < 20))
    {
      if (not_got_mode_type)
      {
        if (receiver_driven_start(mode))
        {
          massive_cancel();
          g_fclose(fileptr);
          g_free(buffer);
          return;
        }
      }
      result=recv_packet(buffer,&length,&gotpacketno,crc_type);
      wait_for_xmit(tswitch,20);
      wait_for_sending_state(SMALL_TIMEOUT_TICKS,0);
      empty_inbuffer(tswitch);
#ifdef DEBUG
      sprintf(s,"Received packet %03d result %03d",gotpacketno,result);
      print_str_cr_to(s,0);
#endif
      switch (result)
      {
        case CAN_CHR: if (check_cancel())
                      {
                        massive_cancel();
                        g_fclose(fileptr);
                        g_free(buffer);
                        return;
                      }
                      break;
        case ACK_CHR: if (((unsigned char)gotpacketno) ==
                          ((unsigned char)last_packet(packetno)))
                      {
                        keep_packet = 0;
                        send_short(ACK_CHR);
                        not_received = 0;
                      } else
                      if (((unsigned char)gotpacketno) ==
                          ((unsigned char)packetno))
                      {
                        keep_packet = 1;
                        send_short(ACK_CHR);
                        not_received = 0;
                        not_got_mode_type = 0;
                      } else
                      send_short(NAK_CHR);
                      break;
        case NAK_CHR: if (!not_got_mode_type)
                      {
                        send_short(NAK_CHR);
                      }
                      break;
        case EOT_CHR: flag = 0;
                      keep_packet = 0;
                      send_short(ACK_CHR);
                      not_received = 0;
                      break;
        case (-1):    if (!not_got_mode_type) send_short(NAK_CHR);
                      break;
      }
    }
    if (not_received)
    {
      massive_cancel();
      g_fclose(fileptr);
      g_free(buffer);
      return;
    }
    if (keep_packet)
    {
      proto_write_buffer(fileptr,buffer,length);
      curlength += length;
      packetno++;
    }
  }
  g_fclose(fileptr);
  g_free(buffer);
}
Ejemplo n.º 9
0
void send_xmodem_protocol(char *filename, int length)
{
  int result;
  int packetno = 1;
  int attempts;
  int crc_type;
  char *buffer;
  FILE *fileptr;
  long int curlength = 0;
  long int maxlength;
  int blocklength;
  int not_got_sensible;
  int not_sent;
#ifdef DEBUG
  char s[80];
#endif

#ifdef DEBUG
  print_str_cr_to("Started protocol",0);
#endif
  result = sender_start(&crc_type);
  if ((result == -1) || (result == CAN_CHR))
  {
    massive_cancel();
    return;
  }
#ifdef DEBUG
  print_str_cr_to("Received start",0);
#endif
  if (proto_open_file(filename,&fileptr,"rb"))
  {
    massive_cancel();
    return;
  }
#ifdef DEBUG
  print_str_cr_to("opened file",0);
#endif
  buffer = g_malloc(MAX_PROTO_BUFFER_SIZE,"SNDXMDM");
  if (!buffer)
  {
    massive_cancel();
    g_fclose(fileptr);
    return;
  }
  maxlength = proto_file_length(fileptr);
  while (curlength < maxlength)
  {
    proto_read_buffer(fileptr,buffer,length,&blocklength);
    not_sent = 1;
    attempts = 0;
    while ((not_sent) && (attempts++ < 10))
    {
      empty_inbuffer(tswitch);
#ifdef DEBUG
      sprintf(s,"Sending packet %03d",packetno);
      print_str_cr_to(s,0);
#endif
      send_packet(buffer,length,packetno,crc_type);
      not_got_sensible = 1;
      while (not_got_sensible)
      {
        result = time_char();
#ifdef DEBUG
        sprintf(s,"Received char %03d",result);
        print_str_cr_to(s,0);
#endif
        switch (result)
        {
          case (-1):    not_got_sensible = 0;
                        break;
          case ACK_CHR: not_sent = 0;
                        not_got_sensible = 0;
                        break;
          case NAK_CHR: not_got_sensible = 0;
                        break;
          case CAN_CHR: if (check_cancel())
                        {
                          massive_cancel();
                          g_fclose(fileptr);
                          g_free(buffer);
                          return;
                        }
                        not_got_sensible = 0;
                        break;
        }
      }
    }
    if (not_sent)
    {
        massive_cancel();
        g_free(fileptr);
        g_fclose(fileptr);
        return;
    }
    curlength += length;
    packetno++;
  }
  send_short(EOT_CHR);
  delay(10);
  send_short(EOT_CHR);
  g_fclose(fileptr);
  g_free(fileptr);
}
Ejemplo n.º 10
0
void message_processing(unsigned char inMessage)
{
	static char nb_recu = 0;
	static int boolConfig = 0;
	static TrameAsser t;
	static TrameConfig tc;
	short valeur;
	Trame32 t32;
	TrameAsser t16;
	

	if(nb_recu == 0)
	{
		t.trShort.Xo = inMessage;
		if (t.trDelta.codet == 0b010 ||t.trDelta.codet == 0b101 ||t.trDelta.codet == 0b000 || 
		    t.trDelta.codet == CODE_CONFIG || t.trDelta.codet == CODE_GET_XY || t.trDelta.codet == CODE_GET_ALPHA )
			nb_recu++;
	}
	else if (nb_recu == 1)
	{
		t.trShort.oX =  inMessage;
		
		switch (t.trDelta.codet)
		{
			case CODE_DELTA : //0b10 : //delta
				if (t.trDelta.signe == 1)
					valeur = - t.trDelta.delta;
				else
					valeur = t.trDelta.delta;
				//AD_consDelta = valeur*10950./1000.;
				AD_consDelta = valeur*MM_TO_TICKS;
				AD_consAlpha = 0;
				nb_recu=0;
				reset = 1;
			break;
			
			case CODE_ALPHA : //0b101 : //alpha
				if (t.trAlpha.signe == 1)
					valeur = - t.trAlpha.alpha;
				else
					valeur = t.trAlpha.alpha;
					
				AD_consDelta = 0;
				//AD_consAlpha = valeur*3.14/180.0;
				AD_consAlpha = valeur*TICK_TOUR/360;
				nb_recu=0;
				reset = 1;
			break;
			
			case CODE_STOP : //0b000 :
				AD_consDelta = 0;
				AD_consAlpha = 0;
				nb_recu=0;
				reset = 1;
			break;
			
			case CODE_CONFIG : //0b111
				boolConfig = 1;
				tc.tr4Char.Xooo = t.trShort.Xo;
				tc.tr4Char.oXoo = t.trShort.oX;
				nb_recu++;
			break;	
			
			case CODE_GET_XY :
				nb_recu = 0;
				t32.tpos.y = posY;
				t32.tpos.x = posX;
				if(posY < 0)
					t32.tpos.y = 0;
				if(posX <0)
					t32.tpos.x = 0;
					
				t32.tpos.codet = CODE_GET_XY;
				send_long(t32.l);
			break;
			
			case CODE_GET_ALPHA :
				nb_recu = 0 ;
				if((AD_alphaTotal +AD_alpha) < 0)
				{
					unsigned long alphaCalc =  - (AD_alphaTotal + AD_alpha);
					alphaCalc %= (long int)TICK_TOUR;
					alphaCalc *= 360;
					alphaCalc /= (unsigned long int)TICK_TOUR;
					t16.trAlpha.alpha = alphaCalc;
					t16.trAlpha.signe = 1;	
				}
				else
				{
					unsigned long alphaCalc =  (AD_alphaTotal + AD_alpha);
					alphaCalc %= (long int)TICK_TOUR;
					alphaCalc *= 360;
					alphaCalc /= (unsigned long int)TICK_TOUR;
					t16.trAlpha.alpha =  alphaCalc;
					t16.trAlpha.signe = 0;
				}
				t16.trAlpha.codet = CODE_GET_ALPHA;
				send_short(t16.us);
			break; 
				
				
				
					
		}
		
		
	}
	else if (nb_recu == 2 )
	{
		tc.tr4Char.ooXo = inMessage;
		nb_recu++;
	}
	else
	{
		tc.tr4Char.oooX = inMessage;
		switch (tc.conf.pid)
		{
			case CODE_P : //0b00
				switch (tc.conf.ad1)
				{
					case CODE_CONFIG_DELTA : //0b0
						switch (tc.conf.ad2)
						{
							case CODE_CONFIG_DELTA : // 0b0
								kP_delta.delta = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
							case CODE_CONFIG_ALPHA : // 0b1
								kP_delta.alpha = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
						}
					break;
					case CODE_CONFIG_ALPHA : //0b1
						switch (tc.conf.ad2)
						{
							case CODE_CONFIG_DELTA : // 0b0
								kP_alpha.delta = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
							case CODE_CONFIG_ALPHA : // 0b1
								kP_alpha.alpha = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
						}
					break;
				}		
			break;
			case CODE_D : //0b10
				switch (tc.conf.ad1)
				{
					case CODE_CONFIG_DELTA : //0b0
						switch (tc.conf.ad2)
						{
							case CODE_CONFIG_DELTA : // 0b0
								kD_delta.delta = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
							case CODE_CONFIG_ALPHA : // 0b1
								kD_delta.alpha = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
						}
					break;
					case CODE_CONFIG_ALPHA : //0b1
						switch (tc.conf.ad2)
						{
							case CODE_CONFIG_DELTA : // 0b0
								kD_alpha.delta = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
							case CODE_CONFIG_ALPHA : // 0b1
								kD_alpha.alpha = tc.conf.ent;//(double)(tc.conf.ent + tc.conf.dec/100.);
							break;
						}
					break;
				}		
			break;
		
		}	
		nb_recu = 0;
	}		
	
}
Ejemplo n.º 11
0
void message_processing(unsigned char inMessage)
{
    static char nb_recu = 0;
    static int boolConfig = 0;
    static TrameAsser t;
    static TrameConfig tc;
    short valeur;
    Trame32 t32;
    TrameAsser t16;


    if (nb_recu == 0)
    {
        t.trShort.Xo = inMessage;
        if (t.trGenShort.codet == 0b0100|| t.trGenShort.codet == 0b0101 ||
                t.trGenShort.codet == CODE_ALPHA || t.trGenShort.codet == CODE_STOP ||
                t.trGenShort.codet == CODE_CONFIG || t.trGenShort.codet == CODE_GET_XY ||
                t.trGenShort.codet == CODE_GET_ALPHA || t.trGenShort.codet == CODE_SET_XY ||
                t.trGenShort.codet == CODE_ALPHA_ABS ||
                t.trGenShort.codet == CODE_PRES_GROS ||
                t.trGenShort.codet == CODE_PRES_PRECIS ||
                t.trGenShort.codet == CODE_SET_ALPHA || t.trGenShort.codet == CODE_FREE_WHEEL
                )
            nb_recu++;
    }
    else if (nb_recu == 1)
    {
        t.trShort.oX = inMessage;

        switch (t.trGenShort.codet)
        {

            /*Cas du delta*/
            /*C'set moche mais visiblement case 0x4 || 0x5: marche pas*/
            case 0x4 :
            if (t.trDelta.signe == 1)
                valeur = -t.trDelta.delta;
            else
                valeur = t.trDelta.delta;
            //AD_consDelta = valeur*10950./1000.;
            AD_consDelta = valeur*MM_TO_TICKS;
            AD_consAlpha = 0;
            nb_recu = 0;
            reset = 1;
            freeWheel = 0;
            break;

            case 0x5 :
            if (t.trDelta.signe == 1)
                valeur = -t.trDelta.delta;
            else
                valeur = t.trDelta.delta;
            //AD_consDelta = valeur*10950./1000.;
            AD_consDelta = valeur*MM_TO_TICKS;
            AD_consAlpha = 0;
            nb_recu = 0;
            reset = 1;
            freeWheel = 0;
            break;

            /*Autre cas*/

        case CODE_ALPHA: //0b101 : //alpha
            if (t.trAlpha.signe == 1)
                valeur = -t.trAlpha.alpha;
            else
                valeur = t.trAlpha.alpha;

            AD_consDelta = 0;
            //AD_consAlpha = valeur*3.14/180.0;
            AD_consAlpha = valeur * TICK_TOUR / 360;
            nb_recu = 0;
            reset = 1;
            freeWheel = 0;
            break;

        case CODE_ALPHA_ABS:
            if (t.trAlpha.signe == 1)
                valeur = -t.trAlpha.alpha;
            else
                valeur = t.trAlpha.alpha;
            long int actuel = AD_alphaTotal; //alpha actuel
            actuel %= (long int)TICK_TOUR;
            long int demande = (long int)valeur;
            demande *= TICK_TOUR;
            demande /= 360;
            demande %= (long int) TICK_TOUR;
            long int diff = demande - actuel;
            if (diff > TICK_TOUR/2)
            {
                diff = diff - TICK_TOUR;

            }
            else if (diff < -(TICK_TOUR/2))
            {
                diff = TICK_TOUR + diff;
            }
            AD_consDelta = 0;
            AD_consAlpha = diff;
            nb_recu = 0;
            reset = 1;
            freeWheel = 0;
            break;
            
        case CODE_SET_ALPHA:
            nb_recu = 0;
            if (t.trAlpha.signe == 1)
                valeur = -t.trAlpha.alpha;
            else
                valeur = t.trAlpha.alpha;
            alphaRad = (double)valeur*PI/180.0;//conversion en radian
            AD_alphaTotal = alphaRad*(TICK_TOUR/DEUX_PI);//conversion en ticks
            break;

        case CODE_STOP: //0b0000 :
            AD_consDelta = 0;
            AD_consAlpha = 0;
            nb_recu = 0;
            reset = 1;
            freeWheel = 0;
            break;

        case CODE_CONFIG: //0b111
            boolConfig = 1;
            tc.tr4Char.Xooo = t.trShort.Xo;
            tc.tr4Char.oXoo = t.trShort.oX;
            nb_recu++;
            break;

        case CODE_GET_XY:
            nb_recu = 0;

            t32.tpos.x = (int)(dXdouble*TICKS_TO_MM);
            t32.tpos.y = (int)(dYdouble*TICKS_TO_MM);
            if ((int)t32.tpos.y < 0)
                t32.tpos.y = 0;
            if ( (int)t32.tpos.x < 0)
                t32.tpos.x = 0;

            t32.tpos.codet = CODE_GET_XY;
            send_long(t32.l);
            break;

        case CODE_GET_ALPHA:
            nb_recu = 0;
            if ((AD_alphaTotal ) < 0)
            {
                unsigned long alphaCalc = -(AD_alphaTotal);
                alphaCalc %= (long int) TICK_TOUR;
                alphaCalc *= 360;
                alphaCalc /= (unsigned long int) TICK_TOUR;
                t16.trAlpha.alpha = alphaCalc;
                t16.trAlpha.signe = 1;
            }
            else
            {
                unsigned long alphaCalc = (AD_alphaTotal);
                alphaCalc %= (long int) TICK_TOUR;
                alphaCalc *= 360;
                alphaCalc /= (unsigned long int) TICK_TOUR;
                t16.trAlpha.alpha = alphaCalc;
                t16.trAlpha.signe = 0;
            }
            t16.trAlpha.codet = CODE_GET_ALPHA;
            send_short(t16.us);
            break;

        case CODE_SET_XY:
            nb_recu++;
            tc.tr4Char.Xooo = t.trShort.Xo;
            tc.tr4Char.oXoo = t.trShort.oX;
            break;

        case CODE_PRES_GROS:
            nb_recu = 0;
            setGros();
            break;

        case CODE_PRES_PRECIS:
            nb_recu = 0;
            setPrecis();
            break;

        case CODE_FREE_WHEEL :
            freeWheel = 1;
            nb_recu = 0;
            break;

            

        }


    }
    else if (nb_recu == 2)
    {
        tc.tr4Char.ooXo = inMessage;
        nb_recu++;
    }
    else
    {
        tc.tr4Char.oooX = inMessage;
        if (tc.tpos.codet == CODE_SET_XY)//Le psoc veut définir la position
        {

            int px = (int)tc.tpos.x;
            int py = (int)tc.tpos.y;
            // on l'un des param est -1 on ne le met pas a jour
            if (px < 0xFFF)//sur 12 bits
                dXdouble = (double) (px * MM_TO_TICKS);
            if (py < 0xFFF)
                dYdouble = (double) (py * MM_TO_TICKS);

            if (dYdouble < 0)
                dYdouble = 0;
            if (dXdouble < 0)
                dXdouble = 0;


        }
        else
        {
            switch (tc.conf.pid)
            {
            case CODE_P: //0b00
                switch (tc.conf.ad1)
                {
                case CODE_CONFIG_DELTA: //0b0
                    switch (tc.conf.ad2)
                    {
                    case CODE_CONFIG_DELTA: // 0b0
                        kP_delta.delta = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    case CODE_CONFIG_ALPHA: // 0b1
                        kP_delta.alpha = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    }
                    break;
                case CODE_CONFIG_ALPHA: //0b1
                    switch (tc.conf.ad2)
                    {
                    case CODE_CONFIG_DELTA: // 0b0
                        kP_alpha.delta = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    case CODE_CONFIG_ALPHA: // 0b1
                        kP_alpha.alpha = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    }
                    break;
                }
                break;
            case CODE_D: //0b10
                switch (tc.conf.ad1)
                {
                case CODE_CONFIG_DELTA: //0b0
                    switch (tc.conf.ad2)
                    {
                    case CODE_CONFIG_DELTA: // 0b0
                        kD_delta.delta = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    case CODE_CONFIG_ALPHA: // 0b1
                        kD_delta.alpha = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    }
                    break;
                case CODE_CONFIG_ALPHA: //0b1
                    switch (tc.conf.ad2)
                    {
                    case CODE_CONFIG_DELTA: // 0b0
                        kD_alpha.delta = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    case CODE_CONFIG_ALPHA: // 0b1
                        kD_alpha.alpha = tc.conf.ent; //(double)(tc.conf.ent + tc.conf.dec/100.);
                        break;
                    }
                    break;
                }
                break;

            }
        }
        nb_recu = 0;
    }

}