Commit f21dfc57 authored by 16이상민's avatar 16이상민

Extract class because class 'CoordinateMapperManager' has more than 2 features.

Create module because class 'SourceBuffer' and class 'KinectAccessManager' access
Since I have extracted the class, correct the test code for class 'SourceBuffer'
Create the test code for class 'KinectAccessManager'
parent 36e20b59
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;
using KinectModule;
public class KinectAccessManagerTests
{
KinectAccessManager _KinectAccessManager = new KinectAccessManager();
[Test]
public void KinectAccessManagerTestsSimplePasses()
{
// Use the Assert class to test conditions.
_KinectAccessManager.Access();
Assert.IsTrue(_KinectAccessManager.IsAccess, "Kinect Access Error.");
_KinectAccessManager.Dispose();
Assert.IsFalse(_KinectAccessManager.IsAccess, "Kinect Dispose Error.");
}
// A UnityTest behaves like a coroutine in PlayMode
// and allows you to yield null to skip a frame in EditMode
[UnityTest]
public IEnumerator KinectAccessManagerTestsWithEnumeratorPasses()
{
// Use the Assert class to test conditions.
// yield to skip a frame
yield return null;
}
}
fileFormatVersion: 2
guid: 815a622fd2160ac4c9f35d4d3954c0a0
timeCreated: 1515328105
licenseType: Free
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
...@@ -3,9 +3,11 @@ using NUnit.Framework; ...@@ -3,9 +3,11 @@ using NUnit.Framework;
using System.Collections; using System.Collections;
using Windows.Kinect; using Windows.Kinect;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using KinectModule;
public class SourceBufferTests public class SourceBufferTests
{ {
KinectAccessManager _KinectAccessManager = new KinectAccessManager();
SourceBuffer _SourceBuffer = new SourceBuffer(); SourceBuffer _SourceBuffer = new SourceBuffer();
[Test] [Test]
...@@ -13,29 +15,18 @@ public class SourceBufferTests ...@@ -13,29 +15,18 @@ public class SourceBufferTests
{ {
// Use the Assert class to test conditions. // Use the Assert class to test conditions.
var sensor = KinectSensor.GetDefault(); _KinectAccessManager.Access();
Assert.IsNotNull(sensor, "No ready kinect found."); Assert.IsTrue(_KinectAccessManager.IsAccess, "Kinect Access Error.");
sensor.Open();
Assert.IsTrue(sensor.IsOpen, "Kinect sensor has problem.");
var coordinateMapper = sensor.CoordinateMapper;
using (var sourceFrameReader = sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body))
{
while (sourceFrameReader == null) ;
var sourceFrame = sourceFrameReader.AcquireLatestFrame();
var sourceFrame = _KinectAccessManager.SourceFrame;
_SourceBuffer.UpdateBuffers(sourceFrame); _SourceBuffer.UpdateBuffers(sourceFrame);
ColorBufferTest(sourceFrame); ColorBufferTest(sourceFrame);
BodyIndexBufferTest(sourceFrame); BodyIndexBufferTest(sourceFrame);
} DepthBufferTest(sourceFrame);
BodyBufferTest(sourceFrame);
sensor.Close(); _KinectAccessManager.Dispose();
} }
private void ColorBufferTest(MultiSourceFrame sourceFrame) private void ColorBufferTest(MultiSourceFrame sourceFrame)
...@@ -66,7 +57,7 @@ public class SourceBufferTests ...@@ -66,7 +57,7 @@ public class SourceBufferTests
Assert.AreEqual(bodyIndexBuffer, _SourceBuffer.BodyIndexBuffer, "BodyIndexBufferTest failed."); Assert.AreEqual(bodyIndexBuffer, _SourceBuffer.BodyIndexBuffer, "BodyIndexBufferTest failed.");
} }
private void UpdateDepthBuffer(MultiSourceFrame sourceFrame) private void DepthBufferTest(MultiSourceFrame sourceFrame)
{ {
var depthBuffer = new ushort[SourceBuffer.DepthWidth * SourceBuffer.DepthHeight]; var depthBuffer = new ushort[SourceBuffer.DepthWidth * SourceBuffer.DepthHeight];
using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame()) using (var depthFrame = sourceFrame.DepthFrameReference.AcquireFrame())
...@@ -80,7 +71,7 @@ public class SourceBufferTests ...@@ -80,7 +71,7 @@ public class SourceBufferTests
Assert.AreEqual(depthBuffer, _SourceBuffer.DepthBuffer, "DepthBufferTest failed."); Assert.AreEqual(depthBuffer, _SourceBuffer.DepthBuffer, "DepthBufferTest failed.");
} }
private void UpdateBodyBuffer(MultiSourceFrame sourceFrame) private void BodyBufferTest(MultiSourceFrame sourceFrame)
{ {
var bodyBuffer = new Body[SourceBuffer.BodyCount]; var bodyBuffer = new Body[SourceBuffer.BodyCount];
using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame()) using (var bodyFrame = sourceFrame.BodyFrameReference.AcquireFrame())
......
using UnityEngine; using UnityEngine;
using Windows.Kinect; using Windows.Kinect;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System;
public class CoordinateMapperManager : MonoBehaviour public class CoordinateMapperManager : MonoBehaviour
{ {
private KinectSensor _Sensor;
private CoordinateMapper _CoordinateMapper;
private MultiSourceFrameReader _SourceFrameReader;
private DepthSpacePoint[] _DepthCoordinates; private DepthSpacePoint[] _DepthCoordinates;
private SourceBuffer _SourceBuffer; private KinectModule.SourceBuffer _SourceBuffer;
private KinectModule.KinectAccessManager _KinectAccessManager;
long frameCount = 0; long frameCount = 0;
...@@ -31,11 +30,11 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -31,11 +30,11 @@ public class CoordinateMapperManager : MonoBehaviour
void Awake() void Awake()
{ {
_ColorRGBX = new Texture2D (SourceBuffer.ColorWidth, SourceBuffer.ColorHeight, TextureFormat.RGBA32, false); _ColorRGBX = new Texture2D (KinectModule.SourceBuffer.ColorWidth, KinectModule.SourceBuffer.ColorHeight, TextureFormat.RGBA32, false);
_DepthCoordinates = new DepthSpacePoint[SourceBuffer.ColorWidth * SourceBuffer.ColorHeight]; _DepthCoordinates = new DepthSpacePoint[KinectModule.SourceBuffer.ColorWidth * KinectModule.SourceBuffer.ColorHeight];
InitializeDefaultSensor (); _KinectAccessManager.Access();
} }
void OnGUI () void OnGUI ()
...@@ -46,39 +45,12 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -46,39 +45,12 @@ public class CoordinateMapperManager : MonoBehaviour
GUI.Box (new Rect(10, 50, 200, 30), "NULL MSFR Frame"); GUI.Box (new Rect(10, 50, 200, 30), "NULL MSFR Frame");
} }
void InitializeDefaultSensor()
{
_Sensor = KinectSensor.GetDefault();
if (_Sensor == null)
{
//TODO: Popup Modal Window
Debug.LogError("No ready Kinect found!");
Application.Quit();
}
_CoordinateMapper = _Sensor.CoordinateMapper;
_Sensor.Open();
if (!_Sensor.IsOpen)
{
//TODO: Popup Modal Window
Debug.LogError("Kinect sensor has problem!");
Application.Quit();
}
_SourceFrameReader = _Sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body);
}
void ProcessFrame() void ProcessFrame()
{ {
var DepthData = GCHandle.Alloc(_SourceBuffer.DepthBuffer, GCHandleType.Pinned); var DepthData = GCHandle.Alloc(_SourceBuffer.DepthBuffer, GCHandleType.Pinned);
var pDepthCoordinatesData = GCHandle.Alloc(_DepthCoordinates, GCHandleType.Pinned); var pDepthCoordinatesData = GCHandle.Alloc(_DepthCoordinates, GCHandleType.Pinned);
_CoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr( _KinectAccessManager.CoordinateMapper.MapColorFrameToDepthSpaceUsingIntPtr(
DepthData.AddrOfPinnedObject(), DepthData.AddrOfPinnedObject(),
(uint)_SourceBuffer.DepthBuffer.Length * sizeof(ushort), (uint)_SourceBuffer.DepthBuffer.Length * sizeof(ushort),
pDepthCoordinatesData.AddrOfPinnedObject(), pDepthCoordinatesData.AddrOfPinnedObject(),
...@@ -107,10 +79,7 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -107,10 +79,7 @@ public class CoordinateMapperManager : MonoBehaviour
{ {
GetFPS(); GetFPS();
if (_SourceFrameReader == null) var sourceFrame = _KinectAccessManager.SourceFrame;
return;
var sourceFrame = _SourceFrameReader.AcquireLatestFrame();
if ((nullFrame = sourceFrame == null)) if ((nullFrame = sourceFrame == null))
return; return;
...@@ -123,22 +92,14 @@ public class CoordinateMapperManager : MonoBehaviour ...@@ -123,22 +92,14 @@ public class CoordinateMapperManager : MonoBehaviour
{ {
_DepthCoordinates = null; _DepthCoordinates = null;
if (_SourceFrameReader != null) _KinectAccessManager.Dispose();
{
_SourceFrameReader.Dispose();
_SourceFrameReader = null;
}
if (_Sensor != null)
{
_Sensor.Close();
_Sensor = null;
}
} }
} }
public class SourceBuffer namespace KinectModule
{ {
public class SourceBuffer
{
public const int DepthWidth = 512; public const int DepthWidth = 512;
public const int DepthHeight = 424; public const int DepthHeight = 424;
public const int ColorWidth = 1920; public const int ColorWidth = 1920;
...@@ -161,10 +122,10 @@ public class SourceBuffer ...@@ -161,10 +122,10 @@ public class SourceBuffer
public void UpdateBuffers(MultiSourceFrame sourceFrame) public void UpdateBuffers(MultiSourceFrame sourceFrame)
{ {
UpdateColorBuffer (sourceFrame); UpdateColorBuffer(sourceFrame);
UpdateBodyIndexBuffer(sourceFrame); UpdateBodyIndexBuffer(sourceFrame);
UpdateDepthBuffer (sourceFrame); UpdateDepthBuffer(sourceFrame);
UpdateBodyBuffer (sourceFrame); UpdateBodyBuffer(sourceFrame);
} }
private void UpdateColorBuffer(MultiSourceFrame sourceFrame) private void UpdateColorBuffer(MultiSourceFrame sourceFrame)
...@@ -206,4 +167,93 @@ public class SourceBuffer ...@@ -206,4 +167,93 @@ public class SourceBuffer
if (bodyFrame != null) if (bodyFrame != null)
bodyFrame.GetAndRefreshBodyData(_BodyBuffer); bodyFrame.GetAndRefreshBodyData(_BodyBuffer);
} }
}
public class KinectAccessManager : IDisposable
{
private KinectSensor _Sensor;
private CoordinateMapper _CoordinateMapper;
private MultiSourceFrameReader _SourceFrameReader;
private bool _IsSensorOpen = false;
private bool _IsFrameReaderOpen = false;
public bool IsAccess
{ get { return _IsSensorOpen && _IsFrameReaderOpen; } }
public CoordinateMapper CoordinateMapper
{ get { return IsAccess ? _CoordinateMapper : null; } }
public MultiSourceFrame SourceFrame
{ get { return IsAccess ? _SourceFrameReader.AcquireLatestFrame() : null; } }
public void Access()
{
OpenSensor();
OpenFrameReader();
_CoordinateMapper = _Sensor.CoordinateMapper;
}
private void OpenSensor()
{
if (_IsSensorOpen)
return;
_Sensor = KinectSensor.GetDefault();
if (_Sensor == null)
{
//TODO: Popup Modal Window
Debug.LogError("No ready Kinect found!");
return;
}
_Sensor.Open();
if (!_Sensor.IsOpen)
{
//TODO: Popup Modal Window
Debug.LogError("Kinect sensor has problem!");
CloseSensor();
return;
}
_IsSensorOpen = true;
}
private void OpenFrameReader()
{
if (_IsFrameReaderOpen)
return;
_SourceFrameReader = _Sensor.OpenMultiSourceFrameReader(
FrameSourceTypes.Color |
FrameSourceTypes.Depth |
FrameSourceTypes.BodyIndex |
FrameSourceTypes.Body);
_IsSensorOpen = (_SourceFrameReader != null);
}
public void Dispose()
{
CloseFrameReader();
CloseSensor();
}
private void CloseSensor()
{
if (_IsSensorOpen)
{
_Sensor.Close();
_IsSensorOpen = false;
}
}
private void CloseFrameReader()
{
if (_IsFrameReaderOpen)
{
_SourceFrameReader.Dispose();
_IsFrameReaderOpen = false;
}
}
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment