// ***************************************************************************************************
void  NetControl( tUChar recDataLen )
 {
	tUChar blok;
	tUInt *p_fw;
	tUInt *p_data;

 	tUChar *p;
    tUChar cSts;
		
	tULong *adrptr;
	
	NetDataOut.Magic[0] = 0x61;		// a
	NetDataOut.Magic[1] = 0x61;		// a
	NetDataOut.Magic[2] = 0x61;		// a
	NetDataOut.Magic[3] = 0x61;		// a
	
	NetDataOut.Command = CMD_OK;

// v NetDataOut.Data[1] se vraci ridici slovo
// v NetDataOut.Data[2] vraci stav zapisu do FLASH

  switch(NetDataIn.Command)				// prisel prikaz
   {
	 
	 case CMD_INIT:						// inicializace fwdata bufferu na zacatek
			
		for(Idx = 0; Idx < 128; Idx++) fwdata[Idx] = 0xff; // nutne musi byt inicializovan buffer na 0xff
		Idx = 0;
				
	 	NetDataOut.Data[1] = 'K';
	 	NetDataOut.Data[2] = 'O';

	 break;

// ****************************************************
	 case CMD_DATA:						// prisly data

		p_fw = &fwdata[Idx];
		p_data = &NetDataIn.Data[0];

		for(i=0; i<recDataLen/2; i++)
		 {
		    if (Idx>127) Idx = 127;				// 128 bajtu max.
			 else
			  {
				*p_fw = swapWord (*p_data);	// zkopiruj je do fwdata bufferu
				p_fw++;
				p_data++;
				Idx+=2;
			  }
		 }
		

		NetDataOut.Data[1] = Idx;
		NetDataOut.Data[2] = 0;
		NetDataOut.Data[3] = 0;

	    appCB.display.LED ^= 0x2; 
        appCB.display.LED &= ~0x1; 
	

	    NetDataOut.Data[1] = 'K';
		NetDataOut.Data[2] = 'O';
 	break;

// ****************************************************
	case CMD_FLASH:								// PRIKAZ ZAPIS DO FLASH

//	  LED_RED_ON();
	  
	  *(tUInt*)&NetDataIn.Data[0] = swapWord(*(tUInt*) &NetDataIn.Data[0]);
	  *(tUInt*)&NetDataIn.Data[2] = swapWord(*(tUInt*) &NetDataIn.Data[2]);


      adresa =  *(tULong*)&NetDataIn.Data[0];
   	  if (adresa == 0x0)						// prisel prvni blok dat, to jsou vektory
	   {
		 userAppAddr =  *(tULong*)&fwdata[0] ; 	// zalohuj start vektor do USER aplikace nejdrive v RAM, po dokonceni
		 						  	 	 	    				// downloadu jej ulozim do EEPROM
		 
		 *(tULong*)&fwdata[0] = *(tULong*)BOOT_APPL_ADDRESS;	// obnov reset vektor do BOOTLOADERU, at se nesmaze

			EraseFlash(0);
			if ((NetDataOut.Data[2] = ProgramFlash(&fwdata, 0x0, 0x80)) != FLASH_WRITE_OK)  NetDataOut.Data[1] = 'A'; 
			  else NetDataOut.Data[1] = 'K';
   	   }

		// druha cast vektoru, to je druhy 128B blok pameti, vektory jsou roztahle pres 2 bloky
		else if (adresa == 0x80)
	     {
			*(tULong*)&fwdata[16] =  userAppAddr;   // obnov vektor do USER APP
			if ((NetDataOut.Data[2] = ProgramFlash(&fwdata, 0x80, Idx)) != FLASH_WRITE_OK) NetDataOut.Data[1] = 'B'; 
			 else NetDataOut.Data[1] = 'K';
		 }
  	  
	    else 
		   {
		 	 if ((NetDataOut.Data[2] = ProgramFlash(&fwdata, adresa, Idx)) != FLASH_WRITE_OK)
			  {
			    NetDataOut.Data[1] = 'F';
			  }
		      else NetDataOut.Data[1] = 'K';
		   }

 	 NetDataOut.Data[2] = 'O';		   

	 packet_counter++;				// POCITADLO PAKETU PRO DISPLEJ
     sprintf( appCB.display.string_buffer, "%3x" , packet_counter<<4); // zobrazuji na displeji pocet ulozenych radku *.MOT
	 PrintDisp(appCB.display.string_buffer);					  
	 
	 
		   
	 break;
// ****************************************************
	case CMD_ERASE:										// bude se mazat pamet
	 {
	   blok =  NetDataIn.Data[0];	 					// adresa stranky 
  
	   if (EraseFlash(blok) != FLASH_ERASE_OK)
	     {
		  NetDataOut.Data[1] = 'F';
 		 }
	    else  
		 {
		   NetDataOut.Data[1] = 'K';
		 }
		 
 	 	NetDataOut.Data[2] = 'O';

		if (OPER.BFL == DOWNLOAD_ERROR) 		// pokud je ulozen vypadek komunikace tak obnov OK stav pri navazani opetovne komunikace
		 {
		   OPER.BFL = 0x00;						// kontrolni bajt v EEPROM, kdyz neni 0xaa startuje se do APLIKACE, kdyz je 0x00 tak do Bootloaderu
		   Write_n_EEPROM( 16, 1, &OPER.BFL );
		 }
		 
 	  break;
	 }
// ****************************************************
	case CMD_RESET:								// proved RESET 
		
	  NetDataOut.Data[1] = 'H';
	  BusPutChar( NetDataOut.Data[1]);
		
	  NetDataOut.Data[1] = 'R';
      BusPutChar( NetDataOut.Data[1]);
	
// pokud je aplikace nahrana OK, spust ji
		PrintDisp("rSt");
		i = 60000; do { display(); } while (i--);		// cca 1sec
		i = 60000; do { display(); } while (i--);		// cca 1sec
		i = 60000; do { display(); } while (i--);		// cca 1sec

	    // proved restart po nahrati Sn
		DISPLAY_OFF();
		EnableWDT();
 	    ClearWDT();						// a vzvola se restart pomoci WDT overflow
	    while (1);		
 
		break;
// ****************************************************
	case CMD_WSN:										// ZAPIS SN
		
		fIsDownload = 0;

		adresa = (unsigned long)(&snConst[0]);				// adresa kde je SN ulozno v ROM

	 	for(i=0; i<12; i++) 
		 {
		  fwdata[i] = NetDataIn.Data[i];				// zkopiruj do fwdata z RxBuff
		 }


		if ((NetDataOut.Data[2]=ProgramFlash(&fwdata, adresa, 12)) != FLASH_WRITE_OK) // na adresu SNv FLASH uloz 
		 {
		    NetDataOut.Data[1] = 'F';												  // to co jsi prijal
		    PrintDisp("Er1");			// zobraz potvrzeni na displeji
		 }
		else 
		 {
		   // aktualizuji se vsechny polozky MacAddr
		   cSts = InitConst(1);

		   if (cSts !=1)
		    {
			  PrintDisp("Er2");
			  NetDataOut.Data[1] = 'F';
			}
              else 							// potvrd CP az po ulozeni do EEPROM 
			   {
		   		NetDataOut.Data[1] = 'K';	//! TOHLE nespolupracuje s CP!!! 
				NetDataOut.Data[2] = 'O';
		   		PrintDisp("SAU");			// zobraz potvrzeni na displeji
			   
				appCB.cycles2 = 0;			   
				do {display();} while (appCB.cycles2 < 2000);	// // delay pro zobrazeni napisu SAV na displeji	
			   }

		 }
	  

		 
	break;

// ****************************************************
	 default:
		NetDataOut.Command = CMD_FAIL;
	}

}