1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     hio_SerialChannel.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 25970 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NN_HIO_CTR_HIO_SERIALCHANNEL_H_
17 #define NN_HIO_CTR_HIO_SERIALCHANNEL_H_
18 #ifdef  NN_SWITCH_ENABLE_HOST_IO
19 
20 /*! @file
21     @brief      SerialChannel クラスを定義します。
22 
23     :include nn/hio.h
24 */
25 
26 #include <nn/types.h>
27 
28 namespace nn {
29 namespace hio {
30 namespace CTR {
31 
32     /*!
33     @brief      シリアル通信を行うためのチャンネルを表すクラスです。
34 
35                 PC側でも同一のチャンネルのシリアル通信を開くことでPCと通信することができます。
36 
37                 接続を作る側が @ref Connect を呼び、接続を待つ側が @ref WaitHost を呼びます。
38                 例えば、CTR側が Connect を呼んだ場合は、PC側は WaitHost を呼ぶ必要があります。
39     */
40     class SerialChannel
41     {
42     public:
43         /*!
44         @brief  送受信属性を表す列挙体です。
45         */
46         enum Attribute
47         {
48             ATTRIBUTE_NONE      = 0,            //!<    属性がないことを示します。
49             ATTRIBUTE_NO_WAIT   = (1u << 0),    //!<    データが存在しない場合にブロックしないことを示します。
50             ATTRIBUTE_IN_PC     = (1u << 1)     //!<    バッファ状態の取得に PC 側の状態を含めます。
51         };
52 
53     private:
54         s32     m_Ch;
55 
56     public:
57         /*!
58         @brief  コンストラクタです。別途 @ref Open によって、チャンネルを開く必要があります。
59         */
SerialChannel()60         SerialChannel() : m_Ch(-1) {}
61 
62         /*!
63         @brief  デストラクタです。チャンネルがオープンされている場合は閉じます。
64         */
~SerialChannel()65         ~SerialChannel()
66         {
67             if( m_Ch >= 0 )
68             {
69                 Close();
70             }
71         }
72 
73         /*!
74         @brief                  チャンネルを開きます。
75 
76         @param[in]  ch          使用するチャンネル番号。
77         @param[in]  pWorkMemory ライブラリが使用するワークメモリを指定します。ワークメモリは デバイス用のメモリ である必要があり、サイズは @ref WORKMEMORY_SIZE です。
78 
79         @return                 処理の結果を返します。
80 
81         */
82         Result Open(s32 ch, void* pWorkMemory);
83 
84 
85         /*!
86         @brief                  チャンネルを閉じます。
87 
88         @return                 処理の結果を返します。
89 
90         */
91         Result Close();
92 
93         /*!
94         @brief                  ホストに接続します。
95                                 ホスト側で Wait が呼び出されるまでブロックします。
96 
97         @return                 処理の結果を返します。
98         */
99         Result Connect();
100 
101 
102         /*!
103         @brief                  ホストからの接続を待ちます。
104 
105         @param[in]  attr        接続時の属性。<br>
106                                 ATTRIBUTE_NONE が指定されている場合は、ホスト側から接続されるまでブロックします。<br>
107                                 ATTRIBUTE_NO_WAIT が指定されている場合は、ホスト側からの接続を待たずに処理結果を返します。
108 
109         @return                 処理の結果を返します。
110 
111         接続に成功したときは、@ref ResultConnected と同じResult値が返ります。
112 
113         @ref ATTRIBUTE_NO_WAIT を指定していて、まだ接続されていないときは、@ref ResultNoConnected と同じResult値が返ります。
114 
115         */
116         Result WaitHost(bit32 attr=ATTRIBUTE_NONE);
117 
118 
119         /*!
120         @brief                  ホストとの接続を切断します。
121 
122         @return                 処理の結果を返します。
123 
124         */
125         Result Disconnect();
126 
127         /*!
128         @brief                  送信バッファが空になるまで待ちます。
129                                 ホスト側の受信バッファの状態には関与しません。
130 
131         @return                 処理の結果を返します。
132         */
133         Result Flush();
134 
135 
136         /*!
137         :overload               withresult
138 
139         @brief                  バッファからの読み込み可能サイズを取得し、処理結果を返します。
140 
141         @param[out] pSize       データサイズの格納先。
142         @param[in]  attr        受信属性。<br>
143                                 ATTRIBUTE_NONE が指定されている場合、CTR 側のバッファからの読み込み可能サイズを取得します。<br>
144                                 ATTRIBUTE_IN_PC が指定されている場合、CTR 側と PC 側それぞれのバッファの読み込み可能サイズの合計を取得します。
145 
146         @return                 処理結果を返します。
147         */
148         Result GetReadableSize(size_t* pSize, bit32 attr=ATTRIBUTE_NONE);
149 
150 
151         /*!
152         :overload               withresult
153 
154         @brief                  ホスト側からデータを受信し、処理結果を返します。
155 
156         @param[out] pReadSize   実際に受信したバイト数の格納先。
157         @param[out] buf         データ受信先のバッファ。
158         @param[in]  size        最大受信サイズ。
159         @param[in]  attr        受信属性。<br>
160                                 ATTRIBUTE_NONE が指定されている場合、size で指定したサイズを受信できるか、チャンネルを閉じるまでブロックします。<br>
161                                 ATTRIBUTE_NO_WAIT が指定されている場合、受信データが亡くなった時点でリターンします。
162 
163         @return                 処理結果を返します。
164         */
165         Result Read(size_t* pReadSize, void* buf, size_t size, bit32 attr=ATTRIBUTE_NONE);
166 
167         /*!
168         :overload               noresult
169 
170         @brief                  ホスト側からデータを受信します。
171 
172         @param[out] buf         データ受信先のバッファ。
173         @param[in]  size        最大受信サイズ。
174         @param[in]  attr        受信属性。<br>
175                                 ATTRIBUTE_NONE が指定されている場合、size で指定したサイズを受信できるか、チャンネルを閉じるまでブロックします。<br>
176                                 ATTRIBUTE_NO_WAIT が指定されている場合、受信データが亡くなった時点でリターンします。
177 
178         @return                 実際に受信したバイト数を返します。エラーが発生した場合は -1 を返します。
179         */
180         s32 Read(void* buf, size_t size, bit32 attr=ATTRIBUTE_NONE)
181         {
182             size_t read;
183             return Read(&read, buf, size, attr).IsFailure() ? -1: static_cast<s32>(read);
184         }
185 
186         /*!
187         :overload               withresult
188 
189         @brief                  バッファへの書き込み可能サイズを取得し、処理結果を返します。
190 
191         @param[out] pSize       データサイズの格納先。
192         @param[in]  attr        受信属性。<br>
193                                 ATTRIBUTE_NONE が指定されている場合、CTR 側のバッファの書き込み可能サイズのみを取得します。<br>
194                                 ATTRIBUTE_IN_PC が指定されている場合、CTR 側と PC 側それぞれのバッファの書き込み可能サイズの合計を取得します。
195 
196         @return                 処理結果を返します。
197         */
198         Result GetWritableSize(size_t* pSize, bit32 attr=ATTRIBUTE_NONE);
199 
200         /*!
201         :overload               withresult
202 
203         @brief                  ホスト側へデータを送信し、処理結果を返します。
204 
205         @param[out] pWrittenSize    実際に送信したバイト数の格納先。
206         @param[in]  buf             データ送信元のバッファ。
207         @param[in]  size            最大送信サイズ。
208         @param[in]  attr            送信属性。<br>
209                                     ATTRIBUTE_NONE が指定されている場合、size で指定したサイズを送信するまでブロックします。<br>
210                                     ATTRIBUTE_NO_WAIT が指定されている場合、送信バッファがいっぱいになった時点でリターンします。
211 
212         @return                     処理結果を返します。
213         */
214         Result Write(size_t* pWrittenSize, const void* buf, size_t size, bit32 attr=ATTRIBUTE_NONE);
215 
216         /*!
217         :overload               noresult
218 
219         @brief                  ホスト側へデータを送信します。
220 
221         @param[in]  buf         データ送信元のバッファ。
222         @param[in]  size        最大送信サイズ。
223         @param[in]  attr        送信属性。<br>
224                                 ATTRIBUTE_NONE が指定されている場合、size で指定したサイズを送信するまでブロックします。<br>
225                                 ATTRIBUTE_NO_WAIT が指定されている場合、送信バッファがいっぱいになった時点でリターンします。
226 
227         @return                 実際に送信したバイト数を返します。エラーが発生した場合は -1 を返します。
228         */
229         s32 Write(const void* buf, size_t size, bit32 attr=ATTRIBUTE_NONE)
230         {
231             size_t written;
232             return Write(&written, buf, size,  attr).IsFailure() ? -1: static_cast<s32>(written);
233         }
234     };
235 
236     /*!
237         @brief  接続されていないことを表すResultを返します。
238         @return Result オブジェクトを返します。
239     */
240     nn::Result ResultNoConnected();
241 
242     /*!
243         @brief  接続されたことを表すResultを返します。
244         @return Result オブジェクトを返します。
245     */
246     nn::Result ResultConnected();
247 
ResultNoConnected()248     inline nn::Result ResultNoConnected()
249     {
250         return nn::Result(nn::Result::LEVEL_SUCCESS, nn::Result::SUMMARY_SUCCESS, nn::Result::MODULE_COMMON, 0);
251     }
252 
ResultConnected()253     inline nn::Result ResultConnected()
254     {
255         return nn::Result(nn::Result::LEVEL_SUCCESS, nn::Result::SUMMARY_SUCCESS, nn::Result::MODULE_COMMON, 1);
256     }
257 
258 }
259 }
260 }
261 
262 
263 #endif  // ifdef NN_SWITCH_ENABLE_HOST_IO
264 #endif  // ifndef NN_HIO_CTR_HIO_SERIALCHANNEL_H_
265