nova proba

Revision:
27:0772451fb880
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TcpServer.cpp	Sun Jan 17 23:03:43 2021 +0100
@@ -0,0 +1,225 @@
+#include "mbed.h"
+//#include "string.h"
+
+#include "EthernetSetup.h"
+#include "doHTML.h"
+#include "dataFlash.h"
+
+#include "TcpServer.h"
+#include "SerialCom.h"
+
+#include <iterator>
+#include <list>
+
+
+
+extern EthernetInterface *gp_eth;
+extern C_HTMLparse * gpc_html;
+
+
+
+/* globalni pointer na tcpServer RX Thread za parametarizaciju  */
+static Thread *gp_tcpServerThread = NULL; //new Thread;
+static void tcpServerRx_fun( void );
+
+// char remote_ip[16];
+ int port;
+
+static TCPSocket *gp_tcpSocket=NULL;   /* socket za prijem zahteva za konekciju */
+static Thread *gp_thr = NULL; /* pointer gde se smesta thread za brisanje */
+
+
+
+typedef void(*PF_PSTP)(struct SThreadParam *);   // ne koristi se
+
+// parametri thread-a za uspostavljenje konekcije
+struct SThreadParam
+{
+  Thread *p_Thread; // sopstveni pointer
+  void * p_param;  // pointer za parametre thread-a, u ovom slucaju na socket koji je accept-van
+} ;
+
+struct SThreadParam s_ThrPrm, *gps_ThPrm=&s_ThrPrm;
+list<struct SThreadParam *> lps_tp;
+void showlist( list<struct SThreadParam*> ls )
+{
+    printf("socket list: ");
+     for( auto it=ls.begin(); it!=ls.end(); it++)
+         printf(" %d ", (int)(*it)->p_param );
+     printf("\n");
+}
+
+
+void set_thp(  struct SThreadParam * p)
+{
+    gps_ThPrm->p_param = p->p_param;
+    gps_ThPrm->p_Thread = p->p_Thread;
+    lps_tp.push_front(p);
+    showlist(lps_tp);
+}
+void del_thp(  struct SThreadParam * p )
+{
+    gps_ThPrm->p_param= NULL;
+    gps_ThPrm->p_Thread = NULL;
+    lps_tp.remove(p);
+    showlist(lps_tp);
+}
+
+bool isAny_thp(  void )
+{
+    if( gps_ThPrm->p_param ) return true;
+    return false;
+
+}
+
+
+/******************  inicijalizacija u mainu  ************************/
+static char* html_string;
+
+void start_TcpServer( void )
+{
+    if( test_num(gpc_html->get_myTcpPort()))  port = atoi( gpc_html->get_myTcpPort( ));
+    else port = 11111;
+
+   //del_thp(  NULL );
+
+    if( gp_tcpServerThread )  delete gp_tcpServerThread;
+    gp_tcpServerThread = new Thread();    
+    gp_tcpServerThread->start(tcpServerRx_fun);
+
+}
+
+
+void sentOnTcpServers(  char *buffer, int val  )
+{
+    // if( isAny_thp() )  
+    // {
+    //     ((TCPSocket *)(gps_ThPrm->p_param))->send(buffer, val);
+
+    // }
+
+     for( auto it=lps_tp.begin(); it!=lps_tp.end(); it++)
+         ((TCPSocket *)((*it)->p_param))->send(buffer, val);
+
+
+}
+
+
+
+
+/*****************            u main-u               *************************/
+// zatvaranje thread-a nakon http razmene 
+
+void finish_TcpServerInstance( void )
+{
+        if(gp_thr) 
+        { 
+            printf("Brisanje thread-a %d\n\r", gp_thr); fflush(stdout);
+            gp_thr->join(); 
+            
+            delete gp_thr; 
+            gp_thr = NULL; 
+            printf("Obrisan thread %d\n\r", gp_thr); 
+//            s.release(); 
+        } 
+}
+
+
+/**************  Trajni TCPServer thread *********************************/
+
+
+
+void serverInstance_fun( SThreadParam *ps_thr );
+
+static void tcpServerRx_fun( void )
+{
+  while( true )
+  {  
+    printf("____Otvoren TCP server rx thread____ \n\r");   
+    if( gp_tcpSocket ) {delete gp_tcpSocket; gp_tcpSocket = NULL; } /* ima smisla ako se thread nasilno zatvara  */
+
+      gp_tcpSocket = new TCPSocket;
+      if(gp_tcpSocket->open( gp_eth ) != 0) break;
+      gp_tcpSocket->bind( port );
+
+        if(gp_tcpSocket->listen(2) != 0 )  
+        {   printf("greska listenovanja na socketu\n\r");  break;}
+    
+        TCPSocket *p_soc;
+        nsapi_error_t err=NULL;      
+    int nos = 0;
+
+    while(   (p_soc = gp_tcpSocket->accept( &err))  )
+    {
+
+            Thread *p_thr = new Thread( );
+            struct SThreadParam *ps_thp = new struct SThreadParam;  // alokacija ps_thp
+            ps_thp->p_param = (void*)p_soc;
+            ps_thp->p_Thread = p_thr;
+            set_thp(ps_thp);
+
+            printf("TCPThread: NOVA KONEKCIJA!  thread %d   socket  %d   struct Sst %d\n\r", ps_thp->p_Thread, p_soc, ps_thp);fflush(stdout);
+            p_thr->start( callback( serverInstance_fun, ps_thp ));
+
+
+    }
+    printf("TCP WEB SERVER: Ispad iz accept while!!! socket = %d  err = %d\n\r", p_soc, err);fflush(stdout);
+   }
+  printf("TCP WEB SERVER: Zaustavljen WEB server \n\r");fflush(stdout);
+
+}
+
+
+
+
+/***************** privremeni TCPServer thread za klijenta  ******************/
+// thread je jednokratan - primi http telegram i odgovori - ako je GET ili POST upit
+
+void serverInstance_fun( struct SThreadParam *ps_thp )
+{
+     TCPSocket *p_soc = (TCPSocket *)ps_thp->p_param;
+
+     char inbuff[1500];
+
+      int n;
+     // printf("tcpServThread:  Otvoren socket %d\n\r",(int)p_soc);   
+        
+       //     printf("tcpServThread: cekam prijem od klijenta \n\r");
+            SocketAddress sockAddr;
+            p_soc->getpeername( &sockAddr );
+            
+        //    p_soc->set_timeout(10); // non-blocking pruzimanje bajtova na 10ms
+            n=0;
+            while(true)
+            {
+                
+               n = p_soc->recv( (inbuff), sizeof(inbuff));  // razmotriti obradu nr=0 !!!
+ 
+               if(n>0) 
+               {   
+                   extern void sendToScom(  char *buffer, int val ); 
+                   sendToScom( inbuff, n); 
+                }
+                else 
+                {
+         //           printf("\n\rtcpServer: break na receive  err=%d\n\r",n);  
+                    break; 
+                }
+           }            
+               
+        //{printf("tcpServThread: zatvaranje socketa\n\r"); fflush(stdout);}      
+        
+        del_thp(ps_thp);
+        p_soc->close();    // zatvaranje socketa      
+
+
+        
+        //{printf("tcpServThread: zatvaranje thread-a\n\r"); fflush(stdout);}          
+        // zatvaranje thread-a
+        gp_thr = ps_thp->p_Thread;//   poslati pointer da se delete-uje
+ 
+        //{printf("tcpServThread: brisanje parametara\n\r"); fflush(stdout);}         
+        delete ps_thp; // relokacija ps_thp
+
+}
+