Something went wrong on our end
-
Zach Eisele authoredZach Eisele authored
CTOC.h 5.04 KiB
// Copyright (c) 2013, Jan Winkler <winkler@cs.uni-bremen.de>
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// * Neither the name of Universität Bremen nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
/* \author Jan Winkler */
#ifndef __C_TOC_H__
#define __C_TOC_H__
// System
#include <list>
#include <string>
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
// Private
#include "CCrazyRadio.h"
#include "CCrazyflie.h"
#include "CCRTPPacket.h"
/*! \brief Storage element for logged variable identities */
struct TOCElement {
/*! \brief The numerical ID of the log element on the copter's
internal table */
int nID;
/*! \brief The (ref) type of the log element */
int nType;
/*! \brief The string group name of the log element */
std::string strGroup;
/*! \brief The string identifier of the log element */
std::string strIdentifier;
bool bIsLogging;
double dValue;
double timeLastUpdated;
};
struct LoggingBlock {
std::string strName;
int nID;
double dFrequency;
std::list<int> lstElementIDs;
bool isActive;
};
// Backward declaration of the CCrazyflie and CCrazyradio class to make the compiler happy
class CCrazyflie;
class CCrazyRadio;
class CTOC {
private:
int m_nPort;
int m_nRadioChannel;
CCrazyRadio *m_crRadio;
CCrazyflie *m_crazyflie;
uint16_t m_nItemCount;
std::list<struct TOCElement> m_lstTOCElements;
std::list<struct LoggingBlock> m_lstLoggingBlocks;
std::vector<std::string> m_lstActiveLogging;
int updateAmount = 0;
std::ofstream param_toc_file;
std::ofstream log_toc_file;
std::string paramfilename;
std::string logidfilename;
bool requestInitialItem();
bool requestItem(int nID, bool bInitial);
bool requestItem(int nID);
bool requestNextItem();
bool processItem(CCRTPPacket* crtpItem);
bool processNextItem(CCRTPPacket* crtpItem);
CCRTPPacket* sendAndReceive(CCRTPPacket* crtpSend, int nChannel);
public:
CTOC(CCrazyRadio* crRadio, CCrazyflie *crazyflie, int radioChannel, int nPort);
~CTOC();
bool sendTOCPointerReset();
bool requestMetaData();
bool requestItems();
bool downloadTOC();
void printLoggingBlocksInitialized();
struct TOCElement elementForName(std::string strName, bool& bFound);
struct TOCElement elementForID(int nID, bool &bFound);
int idForName(std::string strName);
int typeForName(std::string strName);
// For loggable variables only
bool registerLoggingBlock(std::string strName, double dFrequency, uint16_t id);
bool unregisterLoggingBlock(std::string strName);
bool unregisterLoggingBlocks();
struct LoggingBlock loggingBlockForName(std::string strName, bool& bFound);
struct LoggingBlock loggingBlockForID(int nID, bool& bFound);
bool startLogging(std::string strName, std::string strBlockName);
bool stopLogging(std::string strName);
bool isLogging(std::string strName);
double doubleValue(std::string strName);
bool enableLogging(std::string strBlockName);
bool disableLogging(std::string strBlockName);
void setBlockActive(int nID, bool activity);
std::string createActiveHeader();
// void processPackets(std::list<CCRTPPacket*> lstPackets);
void processPackets(CCRTPPacket *crtpPacket);
int elementIDinBlock(int nBlockID, int nElementIndex);
bool setFloatValueForElementID(int nElementID, float fValue);
bool setLastUpdateForElementID(int nElementID);
bool addElementToBlock(int nBlockID, int nElementID);
bool unregisterLoggingBlockID(int nID);
void openLogTOCFile(char *baseFileName);
void openParamTOCFile(char *baseFileName);
std::string getLogTOCFile();
std::string getParamTOCFile();
std::string activeLogName(int index);
int sizeOfActiveList();
};
#endif /* __C_TOC_H__ */