-
Notifications
You must be signed in to change notification settings - Fork 4
/
Toshiba_SD-B100.cpp
141 lines (127 loc) · 3.68 KB
/
Toshiba_SD-B100.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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <memory.h>
#include "Toshiba_SD-B100.h"
#include "DVDEmu.h"
#include "Video.h"
/* Only works if VERBOSE_DEBUG is also enabled in DVDEmu.cpp */
#define PACKET_DEBUG 0
#define PACKET_LEN 256
/* Emulator state */
struct toshiba_state
{
char packet[PACKET_LEN];
char response[PACKET_LEN];
} toshiba_state;
void ToshibaInit()
{
memset( toshiba_state.packet, 0, sizeof(toshiba_state.packet) );
memset( toshiba_state.response, 0, sizeof(toshiba_state.response) );
}
void ProcessPacket( const char *in, char *out )
{
/* Assume valid packet */
strcpy( out, "K" );
if( strncmp( in, "WG", 2 ) == 0 )
{
/* Ping request I think, no action needed.
* Characters 3+ are ascii digits for some parameter.
*/
}
else if( strcmp( in, "RE" ) == 0 )
{
/* Reset? */
verbose_printf( "Reset request received.\n" );
PowerOn();
}
else if( strcmp( in, "CL" ) == 0 )
{
/* Clear? */
verbose_printf( "Clear request received.\n" );
PowerOn();
}
else if( strncmp( in, "KL", 2 ) == 0 )
{
/* Unknown packet, Characters 3+ are ascii digits. */
}
else if( strncmp( in, "VM", 2 ) == 0 )
{
/* Unknown packet, Characters 3+ are ascii digits.
* Observed values are '0' before loading chapter,
* '1' after loading chapter when playback should
* start.
*/
}
else if( strncmp( in, "RP", 2 ) == 0 )
{
/* Repeat count */
int rpCnt = atoi( &in[2] );
verbose_printf( "Repeat request for %d times received.\n", rpCnt );
/* TODO: Implement multiple repeats */
}
else if( strcmp( in, "PL" ) == 0 )
{
/* Play */
verbose_printf( "Play request received.\n" );
Play();
}
else if( strcmp( in, "PU" ) == 0 )
{
/* Play */
verbose_printf( "Pause request received.\n" );
Pause();
}
else if( strncmp( in, "CS", 2 ) == 0 )
{
/* Chapter select */
int title = 0;
int chapter = 0;
sscanf( &in[2], "%d,%d", &title, &chapter );
verbose_printf( "Chapter select request for title %d, chapter %d.\n", title, chapter );
/* TODO: Something with titles? */
SeekToChapter( chapter );
}
else
{
/* Unknown packet? */
verbose_printf( "Unknown packet '%s' received!", in );
strcpy( out, "E" );
}
}
int ToshibaReceiveByte( unsigned char byte )
{
if( strlen(toshiba_state.response) > 0 )
{
memset( toshiba_state.response, 0, sizeof(toshiba_state.response) );
}
if( byte == 0x0d )
{
/* Finished packet */
if( PACKET_DEBUG ) { PrintHex( "= Incoming: ", (const unsigned char *)toshiba_state.packet, strlen(toshiba_state.packet) ); }
ProcessPacket( toshiba_state.packet, toshiba_state.response );
memset( toshiba_state.packet, 0, sizeof(toshiba_state.packet) );
return 1;
}
else
{
/* Add to received data */
toshiba_state.packet[strlen(toshiba_state.packet)] = byte;
}
return 0;
}
unsigned char *ToshibaGetResponse( int *length )
{
if( strlen(toshiba_state.response) > 0 )
{
/* Add a 0x0d to the end and return */
toshiba_state.response[strlen(toshiba_state.response)] = 0x0d;
*length = strlen(toshiba_state.response);
if( PACKET_DEBUG ) { PrintHex( "= Outgoing: ", (const unsigned char *)toshiba_state.response, strlen(toshiba_state.response) ); }
return (unsigned char *)toshiba_state.response;
}
/* Nothing to respond with */
*length = 0;
return NULL;
}