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: 32253 $ 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