/* * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2020 KiCad Developers. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, you may find one here: * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html * or you may search the http://www.gnu.org website for the version 2 license, * or you may write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ #ifndef __PNS_LOG_H #define __PNS_LOG_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include class PNS_LOG_FILE { public: PNS_LOG_FILE(); ~PNS_LOG_FILE() {} struct EVENT_ENTRY { VECTOR2I p; PNS::LOGGER::EVENT_TYPE type; const PNS::ITEM* item; KIID uuid; }; // loads a board file and associated P&s event log bool Load( const std::string& logName, const std::string boardName ); BOARD_CONNECTED_ITEM* ItemById( const EVENT_ENTRY& evt ) { BOARD_CONNECTED_ITEM* parent = nullptr; for( auto item : m_board->AllConnectedItems() ) { if( item->m_Uuid == evt.uuid ) { parent = item; break; }; } return parent; } std::vector& Events() { return m_events; } std::shared_ptr GetBoard() const { return m_board; } void SetBoard( std::shared_ptr brd ) { m_board = brd; } PNS::ROUTING_SETTINGS* GetRoutingSettings() const { return m_routerSettings.get(); } private: std::unique_ptr m_routerSettings; std::vector m_events; std::shared_ptr m_board; }; class PNS_TEST_DEBUG_DECORATOR : public PNS::DEBUG_DECORATOR { public: struct DEBUG_ENT { DEBUG_ENT( DEBUG_ENT* aParent = nullptr ) { m_iter = 0; m_color = KIGFX::COLOR4D::WHITE; m_width = 10000; m_name = ""; m_parent = aParent; m_visible = true; m_selected = false; } ~DEBUG_ENT() { for( auto s : m_shapes ) { delete s; } for( auto ch : m_children ) { delete ch; } } DEBUG_ENT* NewChild() { DEBUG_ENT* ent = new DEBUG_ENT( this ); m_children.push_back( ent ); return ent; } void AddChild( DEBUG_ENT* ent ) { ent->m_parent = this; m_children.push_back( ent ); } bool IsVisible() const { if ( m_visible ) return true; auto parent = m_parent; while(parent) { if(parent->m_visible) return true; parent = parent->m_parent; } return false; } void IterateTree( std::function visitor, int depth=0 ); DEBUG_ENT* m_parent; std::vector m_shapes; std::vector m_children; KIGFX::COLOR4D m_color; int m_width; bool m_hasLabels = true; int m_iter; std::string m_name; std::string m_msg; PNS::DEBUG_DECORATOR::SRC_LOCATION_INFO m_srcLoc; bool m_visible; bool m_selected; }; struct STAGE { STAGE() { m_name = ""; m_iter = 0; m_entries = new DEBUG_ENT(); } ~STAGE() { } std::string m_name; int m_iter; DEBUG_ENT* m_entries; }; PNS_TEST_DEBUG_DECORATOR() { m_iter = 0; m_grouping = false; m_activeEntry = nullptr; SetDebugEnabled( true ); } virtual ~PNS_TEST_DEBUG_DECORATOR() { // fixme: I know it's a hacky tool but it should clean after itself at some point... } virtual void SetIteration( int iter ) override { m_iter = iter; } virtual void Message( const wxString msg, const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void NewStage( const std::string& name, int iter, const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void BeginGroup( const std::string name, const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void EndGroup( const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void AddPoint( VECTOR2I aP, const KIGFX::COLOR4D& aColor, int aSize, const std::string aName, const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void AddLine( const SHAPE_LINE_CHAIN& aLine, const KIGFX::COLOR4D& aColor, int aWidth, const std::string aName, const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void AddSegment( SEG aS, const KIGFX::COLOR4D& aColor, const std::string aName, const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void AddBox( BOX2I aB, const KIGFX::COLOR4D& aColor, const std::string aName, const SRC_LOCATION_INFO& aSrcLoc = SRC_LOCATION_INFO() ) override; virtual void Clear(){}; int GetStageCount() const { return m_stages.size(); } STAGE* GetStage( int index ) { return m_stages[index]; } BOX2I GetStageExtents( int stage ) const; private: void addEntry( DEBUG_ENT* ent ); bool m_grouping; DEBUG_ENT* m_activeEntry; STAGE* currentStage(); int m_iter; std::vector m_stages; }; class PNS_TEST_ENVIRONMENT { public: PNS_TEST_ENVIRONMENT(); ~PNS_TEST_ENVIRONMENT(); void SetMode( PNS::ROUTER_MODE mode ); void ReplayLog( PNS_LOG_FILE* aLog, int aStartEventIndex = 0, int aFrom = 0, int aTo = -1 ); PNS_TEST_DEBUG_DECORATOR* GetDebugDecorator() { return &m_debugDecorator; }; private: void createRouter(); PNS::ROUTER_MODE m_mode; PNS_TEST_DEBUG_DECORATOR m_debugDecorator; std::shared_ptr m_board; std::unique_ptr m_iface; std::unique_ptr m_router; }; #endif