diff --git a/api/proto/board/board.proto b/api/proto/board/board.proto index 75f7f22cdd..bb560cf8e8 100644 --- a/api/proto/board/board.proto +++ b/api/proto/board/board.proto @@ -61,14 +61,40 @@ message BoardStackupCopperLayer } +enum BoardStackupLayerType +{ + BSLT_UNKNOWN = 0; + BSLT_COPPER = 1; + BSLT_DIELECTRIC = 2; + BSLT_SILKSCREEN = 3; + BSLT_SOLDERMASK = 4; + BSLT_SOLDERPASTE = 5; + BSLT_UNDEFINED = 7; +} + +message BoardStackupDielectricProperties +{ + double epsilon_r = 1; + double loss_tangent = 2; + string material_name = 3; + kiapi.common.types.Distance thickness = 4; +} + +message BoardStackupDielectricLayer +{ + // A single dielectric slot (between copper layers) can be made up of multiple physical layers + repeated BoardStackupDielectricProperties layer = 1; +} + message BoardStackupLayer { kiapi.common.types.Distance thickness = 1; kiapi.board.types.BoardLayer layer = 2; bool enabled = 3; - oneof item { - BoardStackupCopperLayer copper = 4; - } + BoardStackupLayerType type = 4; + BoardStackupDielectricLayer dielectric = 5; + kiapi.common.types.Color color = 6; + string material_name = 7; } message BoardStackup diff --git a/pcbnew/api/api_pcb_enums.cpp b/pcbnew/api/api_pcb_enums.cpp index 7c031d0e51..03d5e4122b 100644 --- a/pcbnew/api/api_pcb_enums.cpp +++ b/pcbnew/api/api_pcb_enums.cpp @@ -24,6 +24,7 @@ #include <api/board/board_commands.pb.h> #include <wx/wx.h> +#include <board_stackup_manager/board_stackup.h> #include <padstack.h> #include <pcb_dimension.h> #include <pcb_track.h> @@ -766,4 +767,42 @@ RATSNEST_MODE FromProtoEnum( commands::RatsnestDisplayMode aValue ) } } + +template<> +BoardStackupLayerType ToProtoEnum( BOARD_STACKUP_ITEM_TYPE aValue ) +{ + switch( aValue ) + { + case BS_ITEM_TYPE_UNDEFINED: return BoardStackupLayerType::BSLT_UNDEFINED; + case BS_ITEM_TYPE_COPPER: return BoardStackupLayerType::BSLT_COPPER; + case BS_ITEM_TYPE_DIELECTRIC: return BoardStackupLayerType::BSLT_DIELECTRIC; + case BS_ITEM_TYPE_SOLDERPASTE: return BoardStackupLayerType::BSLT_SOLDERPASTE; + case BS_ITEM_TYPE_SOLDERMASK: return BoardStackupLayerType::BSLT_SOLDERMASK; + case BS_ITEM_TYPE_SILKSCREEN: return BoardStackupLayerType::BSLT_SILKSCREEN; + + default: + wxCHECK_MSG( false, BoardStackupLayerType::BSLT_UNKNOWN, + "Unhandled case in ToProtoEnum<BOARD_STACKUP_ITEM_TYPE>"); + } +} + + +template<> +BOARD_STACKUP_ITEM_TYPE FromProtoEnum( BoardStackupLayerType aValue ) +{ + switch( aValue ) + { + case BoardStackupLayerType::BSLT_UNDEFINED: return BS_ITEM_TYPE_UNDEFINED; + case BoardStackupLayerType::BSLT_COPPER: return BS_ITEM_TYPE_COPPER; + case BoardStackupLayerType::BSLT_DIELECTRIC: return BS_ITEM_TYPE_DIELECTRIC; + case BoardStackupLayerType::BSLT_SOLDERPASTE: return BS_ITEM_TYPE_SOLDERPASTE; + case BoardStackupLayerType::BSLT_SOLDERMASK: return BS_ITEM_TYPE_SOLDERMASK; + case BoardStackupLayerType::BSLT_SILKSCREEN: return BS_ITEM_TYPE_SILKSCREEN; + + default: + wxCHECK_MSG( false, BS_ITEM_TYPE_UNDEFINED, + "Unhandled case in FromProtoEnum<BoardStackupLayerType>" ); + } +} + // Adding something new here? Add it to test_api_enums.cpp! diff --git a/pcbnew/board_stackup_manager/board_stackup.cpp b/pcbnew/board_stackup_manager/board_stackup.cpp index 16abaca243..0770dfee83 100644 --- a/pcbnew/board_stackup_manager/board_stackup.cpp +++ b/pcbnew/board_stackup_manager/board_stackup.cpp @@ -425,28 +425,44 @@ bool BOARD_STACKUP::operator==( const BOARD_STACKUP& aOther ) const void BOARD_STACKUP::Serialize( google::protobuf::Any& aContainer ) const { - kiapi::board::BoardStackup stackup; + using namespace kiapi::board; + BoardStackup stackup; for( const BOARD_STACKUP_ITEM* item : m_list ) { - kiapi::board::BoardStackupLayer* layer = stackup.mutable_layers()->Add(); + BoardStackupLayer* layer = stackup.mutable_layers()->Add(); - // TODO dielectric sub-layers layer->mutable_thickness()->set_value_nm( item->GetThickness() ); - layer->set_layer( ToProtoEnum<PCB_LAYER_ID, kiapi::board::types::BoardLayer>( - item->GetBrdLayerId() ) ); + layer->set_layer( ToProtoEnum<PCB_LAYER_ID, types::BoardLayer>( item->GetBrdLayerId() ) ); + layer->set_type( + ToProtoEnum<BOARD_STACKUP_ITEM_TYPE, BoardStackupLayerType>( item->GetType() ) ); switch( item->GetType() ) { - case BOARD_STACKUP_ITEM_TYPE::BS_ITEM_TYPE_COPPER: + case BS_ITEM_TYPE_COPPER: { - layer->mutable_copper()->New(); + layer->set_material_name( "copper" ); // (no copper params yet...) break; } + case BS_ITEM_TYPE_DIELECTRIC: + { + BoardStackupDielectricLayer* dielectric = layer->mutable_dielectric()->New(); + + for( int i = 0; i < item->GetSublayersCount(); ++i ) + { + BoardStackupDielectricProperties* props = dielectric->mutable_layer()->Add(); + props->set_epsilon_r( item->GetEpsilonR( i ) ); + props->set_loss_tangent( item->GetLossTangent( i ) ); + props->set_material_name( item->GetMaterial( i ).ToUTF8() ); + props->mutable_thickness()->set_value_nm( item->GetThickness( i ) ); + } + + break; + } + default: - // TODO break; } } @@ -457,7 +473,8 @@ void BOARD_STACKUP::Serialize( google::protobuf::Any& aContainer ) const bool BOARD_STACKUP::Deserialize( const google::protobuf::Any& aContainer ) { - return true; + // Read-only for now + return false; } diff --git a/qa/tests/api/test_api_enums.cpp b/qa/tests/api/test_api_enums.cpp index 537b55c82f..2184f1348d 100644 --- a/qa/tests/api/test_api_enums.cpp +++ b/qa/tests/api/test_api_enums.cpp @@ -34,6 +34,7 @@ // Board-specific #include <api/board/board_types.pb.h> #include <api/board/board_commands.pb.h> +#include <board_stackup_manager/board_stackup.h> #include <padstack.h> #include <pcb_dimension.h> #include <pcb_track.h> @@ -261,4 +262,9 @@ BOOST_AUTO_TEST_CASE( RatsnestDisplayMode ) testEnums<RATSNEST_MODE, kiapi::board::commands::RatsnestDisplayMode>(); } +BOOST_AUTO_TEST_CASE( BoardStackupLayerType ) +{ + testEnums<BOARD_STACKUP_ITEM_TYPE, kiapi::board::BoardStackupLayerType>(); +} + BOOST_AUTO_TEST_SUITE_END()