-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathN64SimulationDataGenerator.cpp
executable file
·109 lines (88 loc) · 2.82 KB
/
N64SimulationDataGenerator.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include "N64SimulationDataGenerator.h"
#include "N64AnalyzerSettings.h"
#include <AnalyzerHelpers.h>
N64SimulationDataGenerator::N64SimulationDataGenerator()
{
}
N64SimulationDataGenerator::~N64SimulationDataGenerator()
{
}
void N64SimulationDataGenerator::Initialize( U32 simulation_sample_rate, N64AnalyzerSettings* settings )
{
mSimulationSampleRateHz = simulation_sample_rate;
mSettings = settings;
mSimulationData.SetChannel( mSettings->mInputChannel );
mSimulationData.SetSampleRate( simulation_sample_rate );
mSimulationData.SetInitialBitState( BIT_HIGH );
}
U32 N64SimulationDataGenerator::GenerateSimulationData( U64 largest_sample_requested, U32 sample_rate, SimulationChannelDescriptor** simulation_channel )
{
U64 adjusted_largest_sample_requested = AnalyzerHelpers::AdjustSimulationTargetSample( largest_sample_requested, sample_rate, mSimulationSampleRateHz );
while( mSimulationData.GetCurrentSampleNumber() < adjusted_largest_sample_requested )
{
CreatePacket();
}
*simulation_channel = &mSimulationData;
return 1;
}
void N64SimulationDataGenerator::CreateByte(unsigned char byte)
{
}
void N64SimulationDataGenerator::CreateBit(int bit)
{
U32 samples_per_bit = mSimulationSampleRateHz / bitrate;
mSimulationData.TransitionIfNeeded( BIT_LOW );
switch (bit) {
case ZERO_BIT:
mSimulationData.Advance( samples_per_bit * 3);
mSimulationData.TransitionIfNeeded( BIT_HIGH );
mSimulationData.Advance( samples_per_bit );
break;
case ONE_BIT:
mSimulationData.Advance( samples_per_bit );
mSimulationData.TransitionIfNeeded( BIT_HIGH );
mSimulationData.Advance( samples_per_bit * 3);
break;
case CONSOLE_STOP_BIT:
mSimulationData.Advance( samples_per_bit );
mSimulationData.TransitionIfNeeded( BIT_HIGH );
mSimulationData.Advance( samples_per_bit * 2);
mSimulationData.TransitionIfNeeded( BIT_LOW );
mSimulationData.Advance( samples_per_bit);
break;
case CONTROLLER_STOP_BIT:
mSimulationData.Advance( samples_per_bit * 2);
mSimulationData.TransitionIfNeeded( BIT_HIGH );
mSimulationData.Advance( samples_per_bit );
break;
}
}
void N64SimulationDataGenerator::CreatePacket()
{
U32 samples_per_bit = mSimulationSampleRateHz / bitrate;
// simulated console data
mSimulationData.Advance( samples_per_bit * 10 );
U8 byte = 0xCC;
U8 mask = 0x1 << 7;
for( U32 i=0; i<8; i++ )
{
if( ( byte & mask ) != 0 )
CreateBit(ONE_BIT);
else
CreateBit(ZERO_BIT);
mask >>= 1;
}
CreateBit(CONSOLE_STOP_BIT);
// simulated controller response
mSimulationData.Advance( samples_per_bit * 10 );
mask = 0x1 << 7;
for( U32 i=0; i<8; i++ )
{
if( ( byte & mask ) != 0 )
CreateBit(ONE_BIT);
else
CreateBit(ZERO_BIT);
mask >>= 1;
}
CreateBit(CONTROLLER_STOP_BIT);
}