150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*****************************************************************************
 | |
| ** WriteFlashThread.cpp
 | |
| ** Author: Kraku
 | |
| *****************************************************************************/
 | |
| #include "WriteFlashThread.h"
 | |
| #include "Settings.h"
 | |
| #include "Logic.h"
 | |
| #include "const.h"
 | |
| 
 | |
| 
 | |
| void
 | |
| WriteFlashThread::run ()
 | |
| {
 | |
|   end = FALSE;
 | |
|   bool zamykanie = FALSE;
 | |
| 
 | |
|   int character, page_number, packet_number, retries = 0;
 | |
|   unsigned char packet[72], data[16384];	/* 16 kB is one page */
 | |
|   config_t cfg;
 | |
|   cfg.operation = WROM;
 | |
|   cfg.mbc = mbc;
 | |
|   cfg.algorythm = algorythm;
 | |
|   cfg.dap = Settings::dap;
 | |
|   cfg.page_count = page_count;
 | |
| 
 | |
|   if (file == NULL)
 | |
|     {
 | |
|       port->close_port ();
 | |
|       emit error (FILEERROR_O);
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|   do
 | |
|     {				/* send start and wait for ACK */
 | |
|       if (Logic::send_start_packet (port, cfg) == FALSE)
 | |
| 	{
 | |
| 	  port->close_port ();
 | |
| 	  fclose (file);
 | |
| 	  emit error (SEND_ERROR);
 | |
| 	  return;
 | |
| 	}
 | |
|       character = port->receive_char ();
 | |
|       if (character == END || character == TIMEOUT)
 | |
| 	{
 | |
| 	  port->close_port ();
 | |
| 	  fclose (file);
 | |
| 	  emit error (character);
 | |
| 	  return;
 | |
| 	}
 | |
|     }
 | |
|   while (character != ACK && ++retries < 10);	/* repeat 10 times */
 | |
| 
 | |
|   if (retries == 10)
 | |
|     {				/* wait time passed */
 | |
|       port->close_port ();
 | |
|       fclose (file);
 | |
|       emit error (TIMEOUT);
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|   retries = 0;
 | |
| 
 | |
|   /* send rest of data - page after page*/
 | |
|   for (page_number = 0; page_number < page_count; page_number++)
 | |
|     {
 | |
|       packet_number = 0;
 | |
|       /* read another page of data */
 | |
|       memset (data, 0xff, sizeof data);
 | |
|       fread (data, sizeof (char), sizeof (data), file);
 | |
|       /* first packet on page */
 | |
|       Logic::fill_data_packet (packet, &data[packet_number * 64], NORMAL_DATA,
 | |
| 			       packet_number, page_number);
 | |
| 
 | |
|       do
 | |
| 	{			/* send packet and wait for ACK */
 | |
| 
 | |
| 	  //end of thread!!!!
 | |
| 	  if (end)
 | |
| 	    {
 | |
| 	      Logic::fill_data_packet (packet, &data[packet_number * 64],
 | |
| 				       LAST_DATA, packet_number, page_number);
 | |
| 	      zamykanie = TRUE;
 | |
| 
 | |
| 	    }
 | |
| 
 | |
| 	  if (port->send_packet (packet) < PACKETSIZE)
 | |
| 	    {
 | |
| 	      port->close_port ();
 | |
| 	      fclose (file);
 | |
| 	      emit error (SEND_ERROR);
 | |
| 	      return;
 | |
| 	    }
 | |
| 
 | |
| 	  character = port->receive_char ();
 | |
| 	  if (character == END || character == TIMEOUT)
 | |
| 	    {
 | |
| 	      port->close_port ();
 | |
| 	      fclose (file);
 | |
| 	      emit error (character);
 | |
| 	      return;
 | |
| 	    }
 | |
| 	  if (character == ACK)
 | |
| 	    {			/* ACK of packet recive */
 | |
| 	      if (zamykanie)
 | |
| 		{
 | |
| 		  port->close_port ();
 | |
| 		  fclose (file);
 | |
| 		  emit error (END);
 | |
| 		  return;
 | |
| 		}
 | |
| 
 | |
| 	      if (++packet_number == 256)	/* last packet on page */
 | |
| 		break;
 | |
| 	      retries = 0;
 | |
| 	      /* is it last packet of transmision ? */
 | |
| 	      if (packet_number == 255 && page_number == page_count - 1)
 | |
| 		Logic::fill_data_packet (packet, &data[packet_number * 64],
 | |
| 					 LAST_DATA, packet_number,
 | |
| 					 page_number);
 | |
| 	      else		/* nope, it it ordinary packet */
 | |
| 		Logic::fill_data_packet (packet, &data[packet_number * 64],
 | |
| 					 NORMAL_DATA, packet_number,
 | |
| 					 page_number);
 | |
| 	      /* update progress */
 | |
| 	      emit set_progress (page_number * 256 + packet_number,
 | |
| 				 page_count * 256 - 1);
 | |
| 	    }
 | |
| 	  /* NAK - bad packet */
 | |
| 	  else if (++retries == 10)
 | |
| 	    {
 | |
| 	      port->close_port ();
 | |
| 	      fclose (file);
 | |
| 	      emit error (END);
 | |
| 	      return;
 | |
| 	    }
 | |
| 	}
 | |
|       while (1);		/* until all page is send and all ACK recived */
 | |
|     }
 | |
| 
 | |
|   port->close_port ();
 | |
|   fclose (file);
 | |
|   emit error (TRUE);
 | |
| }
 | |
| 
 | |
| void
 | |
| WriteFlashThread::canceled (void)
 | |
| {
 | |
|   end = TRUE;
 | |
| }
 | 
