わいずふぁくとりいがプログラムの話題をウィキします。

(ファイルトランスポータプロトコル - 3)

 デバイス(ESP32)側(EspFileTransporter)の実装を掲載します。

FTServer.ino

// FTServer
//  2020.10.17 - 2020.11.04 ysfactory

static const int PORT = 50001;
static WiFiServer __server(PORT);
static list<ClientPath> __client_list;

void FTServer_setup(void)
{
    __server.begin();
}

bool FTServer_GetClient(const char* path, ClientPath* ret_client)
{
    for(auto client : __client_list)
    {
        if(client.path == string(path))
        {
            *ret_client = client;
            return true;
        }
    }
    return false;
}

void FTServer_loop(void)
{
    list<ClientPath>::iterator it_client = __client_list.begin();
    while( it_client != __client_list.end() )
    {
        //disconnect
        if( ! (*it_client).client.connected() )
        {
            Serial.println("FTServer: disconnect.");
            it_client = __client_list.erase(it_client);
            continue;
        }

        //receive
        while( (*it_client).client.available() )
        {
            FTReceive_OnReceiveByte( (*it_client).client.read(), *it_client );
        }
        ++it_client;
    }

    //accept
    ClientPath client;
    client.client = __server.available();
    if (client.client)
    {              
        Serial.println("FTServer: connected.");
        __client_list.push_back(client);
    }
}

FTSession.ino

// FTSession
//  2020.11.01 - 2020.12.05 ysfactory

const int SESSION_TIMEOUT = 3 * 10;

enum FTSESSION_WAIT
{
    FTSESSION_WAIT_NULL,
    FTSESSION_APPEND_WAIT,
    FTSESSION_BINARY_WAIT,
    FTSESSION_CLOSE_WAIT
}
FTSession_wait = FTSESSION_WAIT_NULL;  
int FTSession_status;

bool FTSession_AppendStart(const char* path, ClientPath& client)
{
    if( FTSession_wait != FTSESSION_WAIT_NULL )
    {
        return false;
    }
    Timer100ms[TIMER_SESSION] = SESSION_TIMEOUT;
    FTSender_SendCommand("#append", path, client);
    FTSession_wait = FTSESSION_APPEND_WAIT;
    return true;
}

bool FTSession_BinaryStart(const unsigned char* data, unsigned size, ClientPath& client)
{
    if( FTSession_wait != FTSESSION_WAIT_NULL )
    {
        return false;
    }
    Timer100ms[TIMER_SESSION] = SESSION_TIMEOUT;
    FTSender_SendBinary(data, size, client);
    FTSession_wait = FTSESSION_BINARY_WAIT;
    return true;
}

bool FTSession_CloseStart(const char* path, ClientPath& client)
{
    if( FTSession_wait != FTSESSION_WAIT_NULL )
    {
        return false;
    }
    Timer100ms[TIMER_SESSION] = SESSION_TIMEOUT;
    FTSender_SendCommand("#close", path, client);
    FTSession_wait = FTSESSION_CLOSE_WAIT;
    return true;
}

void OnReceivedResponse(unsigned char* frame, char** tokens, int nof_token, ClientPath& client)
{
    switch(FTSession_wait)
    {
    case FTSESSION_APPEND_WAIT:
    case FTSESSION_CLOSE_WAIT:
    case FTSESSION_BINARY_WAIT:
        //Append command response
        //Close command response
        //Binary data response
        if( (nof_token >= 2 ) && (strcmp(tokens[1],"OK") == 0) )
        {
            FTSession_status = FT_RESPONSE_OK;
        }
        else
        {
            Serial.println("FTSession: receive error response !");
            FTSession_status = FT_RESPONSE_ERROR;
        }
        FTSession_wait = FTSESSION_WAIT_NULL;
        break;
      }
}

bool FTSession_IsBusy(void)
{
    return FTSession_wait != FTSESSION_WAIT_NULL;
}

int FTSession_GetStatus(void)
{
    return FTSession_status;
}

void FTSession_loop(void)
{
    if( FTSession_wait != FTSESSION_WAIT_NULL )
    {
        if( Timer100ms[TIMER_SESSION] <= 0 )
        {
            Serial.println("FTSession: response timeout !");
            FTSession_status = FT_RESPONSE_TIMEOUT;
            FTSession_wait = FTSESSION_WAIT_NULL;
        }
    }
}

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu

管理人/副管理人のみ編集できます