From d86028ba3e6c0db3c1f56077f481b3bebf883d86 Mon Sep 17 00:00:00 2001
From: deva <deva>
Date: Thu, 25 May 2006 18:18:48 +0000
Subject: *** empty log message ***

---
 client/decoder.cc       | 35 +++++++++++++++++++++++++++++++++--
 client/decoder.h        |  9 ++-------
 client/mainwindow.cc    | 37 +++++++++++++++++++++++++++++++++++--
 client/mainwindow.h     |  5 +++++
 client/networksender.cc | 37 +++++++++++++++++++++++++++++++++++++
 client/networksender.h  | 13 +++++++++++++
 client/status.h         | 42 ++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 167 insertions(+), 11 deletions(-)
 create mode 100644 client/status.h

diff --git a/client/decoder.cc b/client/decoder.cc
index c5b2876..d8bf430 100644
--- a/client/decoder.cc
+++ b/client/decoder.cc
@@ -81,12 +81,25 @@ void Decoder::run()
     if(MIaV::control.isRecording()) {
       if(newconnection) {
         NetworkSender *sender = new NetworkSender(MIaV::control.getCpr());
+
+        sendersmutex.lock();
         senders.push_back(sender);
+        sendersmutex.unlock();
+
         sender->start();
         newconnection = false;
       }
-      senders.back()->pushFrame(frame, false, false);
+
+      sendersmutex.lock();
+      if(senders.isEmpty() == false) 
+        senders.back()->pushFrame(frame,
+                                  MIaV::control.isFrozen(),
+                                  false);
+      sendersmutex.unlock();
+
     } else {
+
+      sendersmutex.lock();
       // Remove idle senders
       QLinkedList<NetworkSender*>::iterator i;
       for (i = senders.begin(); i != senders.end(); i++) {
@@ -97,6 +110,8 @@ void Decoder::run()
           delete ns;
         }
       }
+      sendersmutex.unlock();
+
 
       free(frame);
       newconnection = true;
@@ -107,7 +122,7 @@ void Decoder::run()
 
 char *Decoder::pframeAcquire()
 {
-  pmutex.lock();
+  pmutex.lock();;
   return pframe;
 }
 
@@ -145,11 +160,27 @@ Status Decoder::status()
 {
   Status s;
 
+  s.server_diskspace = 0xffffffff;
+  s.server_diskspace_max = 0xffffffff;
+  s.server_load = 0xffffffff;
+  s.server_load_max = 0xffffffff;
+  s.server_ping_ms = 0xffffffff;
+  s.server_fps = -1.0;
+
+  sendersmutex.lock();
+  // Get the server disk status etc.
+  if(senders.isEmpty() == false) senders.back()->getServerStatus(&s);
+
+  fprintf(stderr, "Load: %d of %d - ", s.server_load, s.server_load_max);
+  fprintf(stderr, "Space: %d of %d\n", s.server_diskspace, s.server_diskspace_max);
+
+  // Read out the queue sizes
   QLinkedList<NetworkSender*>::iterator i;
   for(i = senders.begin(); i != senders.end(); i++) {
     NetworkSender *ns = *i;
     s.queue_sizes.push_back(ns->queueSize());
   }
+  sendersmutex.unlock();
   
   return s;
 }
diff --git a/client/decoder.h b/client/decoder.h
index 717f10a..2f8d575 100644
--- a/client/decoder.h
+++ b/client/decoder.h
@@ -32,17 +32,11 @@
 #include <QMutex>
 
 #include <QLinkedList>
-//#include <QList>
 
 #include "dv.h"
 #include "networksender.h"
 
-class Status {
-public:
-  QList<unsigned int> queue_sizes;
-  unsigned int server_diskspace;
-  unsigned int server_ping;
-};
+#include "status.h"
 
 class Decoder : public QThread
 {
@@ -75,6 +69,7 @@ private:
   QMutex mutex;
 
   QLinkedList<NetworkSender *> senders;
+  QMutex sendersmutex;
 };
 
 #endif/*__MIAV_DECODER_H__*/
diff --git a/client/mainwindow.cc b/client/mainwindow.cc
index 0e7270d..a158c09 100644
--- a/client/mainwindow.cc
+++ b/client/mainwindow.cc
@@ -133,7 +133,22 @@ MainWindow::MainWindow(Decoder *d)
   // Create statusbar
   statusbar = new QStatusBar(this);
   outerlayout->addWidget(statusbar, 1,0, 1,1);
-  statusbar->showMessage("Ready!");
+
+  server_diskspace = new QProgressBar(statusbar);
+  server_diskspace->setRange(0, 100);
+  server_diskspace->setValue(0);
+
+  server_load = new QProgressBar(statusbar);
+  server_load->setRange(0, 100);
+  server_load->setValue(0);
+  
+  messagefield = new QLabel(statusbar);
+
+  statusbar->addWidget(messagefield, 80);
+  statusbar->addWidget(server_diskspace, 10);
+  statusbar->addWidget(server_load, 10);
+  
+  //  statusbar->showMessage("Ready!");
   startTimer(100);
 
   show();
@@ -163,7 +178,25 @@ void MainWindow::timerEvent(QTimerEvent *event)
     statusmsg.prepend(next);
   }
 
-  statusbar->showMessage(statusmsg);
+  messagefield->setText(statusmsg);
+
+  if(s.server_diskspace_max != 0xffffffff) {
+    server_diskspace->setRange(0, s.server_diskspace_max);
+    server_diskspace->setValue(s.server_diskspace);
+    server_diskspace->setEnabled(true);
+  } else {
+    server_diskspace->setRange(0, 0);
+    server_diskspace->setEnabled(false);
+  }
+
+  if(s.server_load_max != 0xffffffff) {
+    server_load->setRange(0, s.server_load_max);
+    server_load->setValue(s.server_load);  
+    server_load->setEnabled(true);
+  } else {
+    server_load->setRange(0, 0);
+    server_load->setEnabled(false);
+  }
 }
 
 
diff --git a/client/mainwindow.h b/client/mainwindow.h
index f02d60f..5b38397 100644
--- a/client/mainwindow.h
+++ b/client/mainwindow.h
@@ -33,6 +33,8 @@
 #include <QLabel>
 #include <QStatusBar>
 
+#include <QProgressBar>
+
 #include "historyframe.h"
 #include "videowidget.h"
 
@@ -81,6 +83,9 @@ private:
 
   // Statusbar
   QStatusBar *statusbar;
+  QLabel *messagefield;
+  QProgressBar *server_diskspace;
+  QProgressBar *server_load;
 };
 
 #endif/*__MIAV_MAINWINDOW_H__*/
diff --git a/client/networksender.cc b/client/networksender.cc
index 2f1d8b0..dcb1919 100644
--- a/client/networksender.cc
+++ b/client/networksender.cc
@@ -37,6 +37,14 @@ NetworkSender::NetworkSender(QString cpr)
 
   // Connect
   //  sleep(1);
+  server_diskspace = 0xffffffff;
+  server_diskspace_max = 0xffffffff;
+  server_load = 0xffffffff;
+  server_load_max = 0xffffffff;
+  server_ping_ms = 0xffffffff;
+  server_fps = -1.0;
+
+  running = true;
 
   fprintf(stderr, "Connect [%p]\n", this);
 }
@@ -78,6 +86,8 @@ unsigned int NetworkSender::queueSize()
 
 void NetworkSender::run()
 {
+  fprintf(stderr, "  Run %p\n", this);
+  
   while(running) {
     if(queueSize()) semaphore.acquire();
 
@@ -93,9 +103,24 @@ void NetworkSender::run()
       sleep_1_frame();
       sleep_1_frame();
       delete frame;
+
+      // TODO: Read status from network
+      // Set status
+      statusmutex.lock();
+      server_diskspace_max = 1000000; 
+      if(server_diskspace == 0xffffffff) server_diskspace = server_diskspace_max;
+      server_diskspace -= (int)(((double)rand() / (double)RAND_MAX) * 10.0);
+      
+      server_load = 90 + (int)(((double)rand() / (double)RAND_MAX) * 10.0);
+      server_load_max = 100;
+      server_ping_ms = (int)(((double)rand() / (double)RAND_MAX) * 100);
+      server_fps = 25.0;
+      statusmutex.unlock();
     }
   }
   terminatesemaphore.release(); // Signal the stop method that the thread has stopped running.
+
+  fprintf(stderr, "  Stop %p\n", this);
 }
 
 void NetworkSender::stop()
@@ -104,3 +129,15 @@ void NetworkSender::stop()
   semaphore.release(); // Kick the thread active
   terminatesemaphore.acquire(); // Wait for the thread to stop
 }
+
+void NetworkSender::getServerStatus(Status *status)
+{
+  statusmutex.lock();
+  status->server_diskspace = server_diskspace;
+  status->server_diskspace_max = server_diskspace_max;
+  status->server_load = server_load;
+  status->server_load_max = server_load_max;
+  status->server_ping_ms = server_ping_ms;
+  status->server_fps = server_fps;
+  statusmutex.unlock();
+}
diff --git a/client/networksender.h b/client/networksender.h
index a25dfaf..e3beb5a 100644
--- a/client/networksender.h
+++ b/client/networksender.h
@@ -35,6 +35,8 @@
 
 #include <frame.h>
 
+#include "status.h"
+
 class NetworkSender : public QThread
 {
 public:
@@ -47,6 +49,8 @@ public:
   void run();
   void stop();
 
+  void getServerStatus(Status *status);
+
 private:
   QString ip;
   unsigned short port;
@@ -57,6 +61,15 @@ private:
   QSemaphore terminatesemaphore;
   QSemaphore semaphore;
   QLinkedList<Frame*> framelist;
+
+  // Server stats
+  QMutex statusmutex;
+  unsigned int server_diskspace;
+  unsigned int server_diskspace_max;
+  unsigned int server_load;
+  unsigned int server_load_max;
+  unsigned int server_ping_ms;
+  double server_fps;
 };
 
 #endif/*__MIAV_NETWORKSENDER_H__*/
diff --git a/client/status.h b/client/status.h
new file mode 100644
index 0000000..6a7bca2
--- /dev/null
+++ b/client/status.h
@@ -0,0 +1,42 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ *            status.h
+ *
+ *  Thu May 25 12:40:31 CEST 2006
+ *  Copyright  2006 Bent Bisballe Nyeng
+ *  deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ *  This file is part of MIaV.
+ *
+ *  MIaV is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  MIaV is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with MIaV; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.
+ */
+#ifndef __MIAV_STATUS_H__
+#define __MIAV_STATUS_H__
+
+class Status {
+public:
+  QList<unsigned int> queue_sizes;
+
+  unsigned int server_diskspace;
+  unsigned int server_diskspace_max;
+  unsigned int server_load;
+  unsigned int server_load_max;
+  unsigned int server_ping_ms;
+  double server_fps;
+};
+
+#endif/*__MIAV_STATUS_H__*/
-- 
cgit v1.2.3