This commit is contained in:
aespin 2024-08-20 10:07:14 +02:00
commit 873a249e08
12 changed files with 804 additions and 0 deletions

0
README.md Normal file
View File

9
cmd/main.go Normal file
View File

@ -0,0 +1,9 @@
package main
import "git.espin.casa/albert/cml04-l2-rsm-out/internal/app"
func main() {
if err := app.Run(); err != nil {
panic(err)
}
}

27
go.mod Normal file
View File

@ -0,0 +1,27 @@
module git.espin.casa/albert/cml04-l2-rsm-out
go 1.22.0
require (
git.espin.casa/albert/cml04-eventer v0.0.0-20240222031945-f20c9e4ddc36
git.espin.casa/albert/logger v0.0.0-20240221100041-dc3cb01119a3
)
require (
github.com/golang/protobuf v1.5.3 // indirect
golang.org/x/net v0.18.0 // indirect
golang.org/x/text v0.14.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
google.golang.org/grpc v1.61.1 // indirect
)
require (
git.espin.casa/albert/cml04-gdm-int v0.0.0-20240221200353-854fa2d29d83
github.com/golang/snappy v0.0.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/nsqio/go-nsq v1.1.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
golang.org/x/sys v0.14.0 // indirect
google.golang.org/protobuf v1.32.0
)

51
go.sum Normal file
View File

@ -0,0 +1,51 @@
git.espin.casa/albert/cml04-eventer v0.0.0-20240222031945-f20c9e4ddc36 h1:HbF07y7ExWmkXVzQeKoo1t/u7rduuvn93IGJFCBCKAg=
git.espin.casa/albert/cml04-eventer v0.0.0-20240222031945-f20c9e4ddc36/go.mod h1:/fj0cTIFEdeYmzL2r4WLEAN2q3N3T48ZPOT1hqusuSI=
git.espin.casa/albert/cml04-gdm-int v0.0.0-20240221200353-854fa2d29d83 h1:M7Tpn26MPG+4PIFEBFwatfajLaEcaGCSeigtfzutGiM=
git.espin.casa/albert/cml04-gdm-int v0.0.0-20240221200353-854fa2d29d83/go.mod h1:ixkbymSPizICKrPse8rBi/WiVDrVZ7PXOKYa7XvB1VM=
git.espin.casa/albert/logger v0.0.0-20240221100041-dc3cb01119a3 h1:HUEESn4o8sVXAUJWGJAATeitiNRxVzzwBU8RiIW4Wzc=
git.espin.casa/albert/logger v0.0.0-20240221100041-dc3cb01119a3/go.mod h1:P1yAUiotJurq7j/wZt6Cnel17HChplkz0E40WD8a5to=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/nsqio/go-nsq v1.1.0 h1:PQg+xxiUjA7V+TLdXw7nVrJ5Jbl3sN86EhGCQj4+FYE=
github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
golang.org/x/net v0.18.0 h1:mIYleuAkSbHh0tCv7RvjL3F6ZVbLjq4+R7zbOn3Kokg=
golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=
google.golang.org/grpc v1.61.1 h1:kLAiWrZs7YeDM6MumDe7m3y4aM6wacLzM1Y/wiLP9XY=
google.golang.org/grpc v1.61.1/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

143
internal/app/app.go Normal file
View File

@ -0,0 +1,143 @@
package app
import (
"context"
"flag"
"fmt"
"os"
"os/signal"
"syscall"
cml04eventer "git.espin.casa/albert/cml04-eventer"
"git.espin.casa/albert/cml04-gdm-int/pkg/api"
"git.espin.casa/albert/cml04-l2-rsm-out/internal/logging"
"git.espin.casa/albert/cml04-l2-rsm-out/internal/service"
"git.espin.casa/albert/logger"
"google.golang.org/protobuf/proto"
)
func Run() error {
// flags
l2OutAddr := flag.String("l2-in-addr", "0.0.0.0:5013", "tcp l2 server address")
nsqAddr := flag.String("nsq-addr", "10.1.152.13", "nsq server address")
nsqPort := flag.Int("nsq-port", 4150, "nsq server port")
logLevel := flag.String("log-level", "debug", "trace debug level")
flag.Parse()
// setup logger
log := logger.New(os.Stdout, *logLevel)
// log fields
logFields := logger.LogFields{
"log_level": *logLevel,
"l2_out_address": *l2OutAddr,
"nsq_address": *nsqAddr,
"nsq_port": *nsqPort,
}
// create service
svc := service.NewService()
svc = logging.NewLogginService(log, svc)
// create context
ctx := context.Background()
// subscribe events
subscriber, err := cml04eventer.NewSubscriber(&cml04eventer.SubscriberConfig{
NSQAddress: *nsqAddr,
NSQPort: *nsqPort,
Unmarshaler: cml04eventer.JSONMarshaler{},
Channel: "cml04-l2-rsm-out",
}, log)
// check error
if err != nil {
log.Error("create subscriber failed", err, logFields)
return err
}
// subscribe events
eventChan, err := subscriber.SubscribeEvent(ctx, "RSM")
if err != nil {
log.Error("subscribe event failed", err, logFields)
return err
}
//
go func() {
for event := range eventChan {
if err := ProcessEvent(event, svc); err != nil {
log.Error("", err, logFields)
}
}
}()
// info banner
log.Info("started cml04-l2-rsm-out telegram service", logFields)
// wait signal to finish
signal := WaitSignal()
log.Info("signal received", logFields.Add(logger.LogFields{
"signal": signal,
}))
return nil
}
func ProcessEvent(evt *cml04eventer.Event, svc service.IService) error {
telegramID, err := evt.EventMeta.Get("telegram_id")
if err != nil {
return err
}
fmt.Println(telegramID)
switch telegramID.(float64) {
case 9000:
// bd roll data holder
bdRollData := &api.BdRollData{}
// unmarshal proto message
if err := proto.Unmarshal(evt.EventData, bdRollData); err != nil {
return err
}
if err := svc.SendBdRollData(context.Background(), bdRollData); err != nil {
return err
}
case 9001:
// ur roll data holder
urRollData := &api.UrRollData{}
// unmarshal proto message
if err := proto.Unmarshal(evt.EventData, urRollData); err != nil {
return err
}
if err := svc.SendUrRollData(context.Background(), urRollData); err != nil {
return err
}
case 9002:
// ed roll data holder
edRollData := &api.EdRollData{}
// unmarshal proto message
if err := proto.Unmarshal(evt.EventData, edRollData); err != nil {
return err
}
if err := svc.SendEdRollData(context.Background(), edRollData); err != nil {
return err
}
case 9003:
// uf roll data holder
ufRollData := &api.UfRollData{}
// unmarshal proto message
if err := proto.Unmarshal(evt.EventData, ufRollData); err != nil {
return err
}
if err := svc.SendUfRollData(context.Background(), ufRollData); err != nil {
return err
}
}
return nil
}
// WaitSignal catching exit signal
func WaitSignal() os.Signal {
ch := make(chan os.Signal, 2)
signal.Notify(
ch,
syscall.SIGINT,
syscall.SIGQUIT,
syscall.SIGTERM,
)
for {
sig := <-ch
switch sig {
case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGTERM:
return sig
}
}
}

View File

@ -0,0 +1,86 @@
package logging
import (
"context"
"time"
"git.espin.casa/albert/cml04-gdm-int/pkg/api"
"git.espin.casa/albert/cml04-l2-rsm-out/internal/service"
"git.espin.casa/albert/logger"
)
type LoggingService struct {
log logger.LoggerAdapter
next service.IService
}
// SendEdRollData implements service.IService.
func (svc *LoggingService) SendEdRollData(ctx context.Context, rollData *api.EdRollData) (err error) {
defer func(start time.Time) {
logFields := logger.LogFields{
"took": time.Since(start),
"ed_roll_id": rollData.GetEdRollId(),
}
if err != nil {
svc.log.Error("Send level 2 ED roll data failed", err, logFields)
} else {
svc.log.Info("Send level 2 ED roll success", logFields)
}
}(time.Now())
return svc.next.SendEdRollData(ctx, rollData)
}
// SendUfRollData implements service.IService.
func (svc *LoggingService) SendUfRollData(ctx context.Context, rollData *api.UfRollData) (err error) {
defer func(start time.Time) {
logFields := logger.LogFields{
"took": time.Since(start),
"uf_roll_id": rollData.GetUfRollId(),
}
if err != nil {
svc.log.Error("Send level 2 UF roll data failed", err, logFields)
} else {
svc.log.Info("Send level 2 UF roll success", logFields)
}
}(time.Now())
return svc.next.SendUfRollData(ctx, rollData)
}
// SendUrRollData implements service.IService.
func (svc *LoggingService) SendUrRollData(ctx context.Context, rollData *api.UrRollData) (err error) {
defer func(start time.Time) {
logFields := logger.LogFields{
"took": time.Since(start),
"ur_roll_id": rollData.GetUrRollId(),
}
if err != nil {
svc.log.Error("Send level 2 UR roll data failed", err, logFields)
} else {
svc.log.Info("Send level 2 UR roll success", logFields)
}
}(time.Now())
return svc.next.SendUrRollData(ctx, rollData)
}
// SendBdRollData implements service.IService.
func (svc *LoggingService) SendBdRollData(ctx context.Context, rollData *api.BdRollData) (err error) {
defer func(start time.Time) {
logFields := logger.LogFields{
"took": time.Since(start),
"bd_roll_id": rollData.GetBdRollId(),
}
if err != nil {
svc.log.Error("Send level 2 BD roll data failed", err, logFields)
} else {
svc.log.Info("Send level 2 BD roll success", logFields)
}
}(time.Now())
return svc.next.SendBdRollData(ctx, rollData)
}
func NewLogginService(log logger.LoggerAdapter, svc service.IService) service.IService {
return &LoggingService{
log: log,
next: svc,
}
}

View File

@ -0,0 +1,45 @@
package service
import (
"context"
"fmt"
"git.espin.casa/albert/cml04-gdm-int/pkg/api"
)
type IService interface {
SendBdRollData(ctx context.Context, rollData *api.BdRollData) (err error)
SendUrRollData(ctx context.Context, rollData *api.UrRollData) (err error)
SendEdRollData(ctx context.Context, rollData *api.EdRollData) (err error)
SendUfRollData(ctx context.Context, rollData *api.UfRollData) (err error)
}
type service struct{}
// SendEdRollData implements IService.
func (*service) SendEdRollData(ctx context.Context, rollData *api.EdRollData) (err error) {
fmt.Printf("roll data: %+v\n", rollData)
return nil
}
// SendUfRollData implements IService.
func (*service) SendUfRollData(ctx context.Context, rollData *api.UfRollData) (err error) {
fmt.Printf("roll data: %+v\n", rollData)
return nil
}
// SendUrRollData implements IService.
func (*service) SendUrRollData(ctx context.Context, rollData *api.UrRollData) (err error) {
fmt.Printf("roll data: %+v\n", rollData)
return nil
}
// SendBdRollData implements IService.
func (*service) SendBdRollData(ctx context.Context, rollData *api.BdRollData) (err error) {
fmt.Printf("roll data: %+v\n", rollData)
return nil
}
func NewService() IService {
return &service{}
}

25
internal/types/bd.go Normal file
View File

@ -0,0 +1,25 @@
package types
type L2Bd struct {
TelegramHeader TelegramHeader
BdRollSetId [20]byte /* roll set identification */
BdRollMaterial [20]byte /* roll material type (H = Hard, */
BdRollsChangedFlag int32 /* 0 = not changed, 1 = changed */
BdRollSetType int32 /* roll set type, 1=DUO */
BdRollDiamNomActTop float32 /* actual nominal diameter of top */
BdRollDiamNomActBot float32 /* actual nominal diameter of bot */
BdRollNominalGap float32 /* nominal roll gap */
BdRollGrooves int32 /* number of grooves (equal for t */
BdRollGrooveWidth [10]float32 /* groove width of each groove (e */
BdRollGrooveStiffnessTop [10]float32 /* stiffness of each groove (top */
BdRollGrooveStiffnessBot [10]float32 /* stiffness of each groove (bott */
BdRollGroovePos [10]float32 /* groove position, the position */
BdRollGrooveSharp [10]int32 /* groove sharpened, 1= no, 2=yes */
BdRollGrooveDepth [10]float32 /* distance from roll barrel to g */
BdRollActualShimpsTop float32 /* thickness chock shim top roll */
BdRollActualShimpsBot float32 /* thickness chock shim bottom ro */
BdTonnageAccum [10]float32 /* tonnage accumulated per groove */
BdDummyArray [10]float32 /* Placeholder for extensions */
BdDummyVal1 float32 /* Placeholder for extensions */
BdDummyVal2 float32 /* Placeholder for extensions */
}

45
internal/types/ed.go Normal file
View File

@ -0,0 +1,45 @@
package types
type L2Ed struct {
TelegramHeader TelegramHeader
EdRollSetId [20]byte /* roll set identification */
EdRollSetType int32 /* roll set type, 1=DUO, 3=EDGER */
EdTonnageAccum [10]float32 /* tonnage accumulated per groove */
EdChangeSleeveLength float32 /* length of the roll changing ca */
EdChangeSleeveDepth float32 /* depth of the roll changing car */
EdChangedFlag int32 /* changed flag , 0=not changed, */
EdRollDiamNomHbo float32 /* actual nominal diameter bottom */
EdRollDiamNomHtp float32 /* actual nominal diameter top ro */
EdRollNoofGrooves int32 /* number of grooves on roll */
EdRollNominalGap float32 /* nominal roll gap */
EdRollMaterial [20]byte /* roll material */
EdRollFlangeDiamTop [10]float32 /* Flange diameters of each groov */
EdRollFlangeDiamBot [10]float32 /* Flange diameters of each groov */
EdRollWebDiamTop [10]float32 /* Web diameters of each groove t */
EdRollWebDiamBot [10]float32 /* Web diameters of each groove b */
EdRollChamWidthTop [10]float32 /* Chamber width for each groove, */
EdRollChamWidthBot [10]float32 /* Chamber width for each groove, */
EdRollGrooveStiffTop [10]float32 /* groove stiffness for each groo */
EdRollGrooveStiffBot [10]float32 /* groove stiffness for each groo */
EdRollAngleFlangeFace [10]float32 /* angle flange face for each gro */
EdRollRootRadius [10]float32 /* root radius for each groove */
EdRollGroovePos [10]float32 /* distance between vertical groo */
EdPasslineOffset float32 /* passline offset */
EdActualShimpsHbo float32 /* thickness chock shim hor. bott */
EdActualShimpsHtp float32 /* thickness chock shim hor. top */
EdDummyArray [10]float32 /* Placeholder for extensions */
EdDummyVal1 float32 /* Placeholder for extensions */
EdDummyVal2 float32 /* Placeholder for extensions */
EdDRollMaterial [20]string /* roll material type (H = Hard, */
EdDRollDiamNomActTop float32 /* actual nominal diameter of top */
EDDRollDiamNomActBot float32 /* actual nominal diameter of bot */
EdDRollNominalGap float32 /* nominal roll gap */
EdDRollGrooves int32 /* number of grooves (equal for t */
EdDRollGrooveWidth [10]float32 /* groove width of each groove (e */
EdDRollGrooveStiffnessTop [10]float32 /* stiffness of each groove (top */
EdDRollGrooveStiffnessBot [10]float32 /* stiffness of each groove (bott */
EdDRollGroovePos [10]float32 /* groove position, the position */
EdDRollGrooveSharp [10]int32 /* groove sharpened, 1= no, 2=yes */
EdDRollActualShimpsTop float32 /* thickness chock shim top roll */
EdDRollActualShimpsBotp float32 /* thickness chock shimbottom rol */
}

11
internal/types/header.go Normal file
View File

@ -0,0 +1,11 @@
package types
type TelegramID int16
type TelegramHeader struct {
MessageLength int16
TelegramID TelegramID
SequenceCounter int16
Flags int16
TimeStamp [8]int16
}

181
internal/types/uf.go Normal file
View File

@ -0,0 +1,181 @@
package types
import (
"bytes"
"encoding/binary"
"unsafe"
"git.espin.casa/albert/cml04-gdm-int/pkg/api"
)
type L2Uf struct {
TelegramHeader *TelegramHeader
UfRollSetId [20]byte /* roll set identification */
UfRollSetType int32 /* roll set type, 1=DUO,2=UNI */
UfTonnageAccum [10]float32 /* tonnage accumulated per groove */
UfChangeSleeveLength float32 /* length of the roll changing ca */
UfChangeSleeveDepth float32 /* depth of the roll changing car */
UfHrChangedFlag int32 /* changed flag horizontal roll, */
UfVrChangedFlag int32 /* changed flag vertical roll, 0= */
UfRollMaterialH [20]byte /* roll material horizontal rolls */
UfRollMaterialV [20]byte /* roll material vertical rolls */
UfHNomGap float32 /* nominal gap (from roll drawing */
UfRollDiamActHbo float32 /* actual nominal diameter bottom */
UfRollDiamActHtp float32 /* actual nominal diameter top ro */
UfRollBarrelWidthHbo float32 /* barrel width bottom roll */
UfRollBarrelWidthHtp float32 /* barrel width top roll */
UfRollChamWidthHbo float32 /* chamber width bottom roll */
UfRollChamWidthHtp float32 /* chamber width top roll */
UfRollAngleHbo float32 /* angle roll flange face bottom */
UfRollAngleHtb float32 /* angle roll flange face top rol */
UfRollDiamActVds float32 /* actual nominal vertical roll d */
UfRollDiamActVos float32 /* actual nominal vertical roll d */
UfRollAngleVds float32 /* roll angle flange face (vertic */
UfRollAngleVos float32 /* roll angle flange face (vertic */
UfActualShimpsHbo float32 /* thickness shimplate hor. botto */
UfActualShimpsHtp float32 /* thickness shimplate hor. top r */
UfActualShimpsVDS1 float32 /* thickness shimplate 1 drive si */
UfActualShimpsVDS2 float32 /* thickness shimplate 2 drive si */
UfActualShimpsVOS1 float32 /* thickness shimplate 1 oper. Si */
UfActualShimpsVOS2 float32 /* thickness shimplate 2 oper. Si */
UfPasslineOffset float32 /* passline offset */
UfPinVChock float32 /* pin between horizontal and ver */
UfDummyVal1 float32 /* Placeholder for Extensions */
UfDummyVal2 float32 /* Placeholder for Extensions */
UfDummyVal3 float32 /* Placeholder for Extensions */
UfDummyVal4 float32 /* Placeholder for Extensions */
UfDRollMaterial [20]byte /* roll material type (H = Hard, */
UfDRollDiamNomActTop float32 /* actual nominal diameter of top */
UfDRollDiamNomActBot float32 /* actual nominal diameter of bot */
UfDRollNominalGap float32 /* nominal roll gap */
UfDRollGrooves int32 /* number of grooves (equal for t */
UfDRollGrooveWidth [10]float32 /* groove width of each groove (e */
UfDRollGrooveStiffnessTop [10]float32 /* stiffness of each groove (top */
UfDRollGrooveStiffnessBot [10]float32 /* stiffness of each groove (bott */
UfDRollGroovePos [10]float32 /* groove position, the position */
UfDRollGrooveSharp [10]int32 /* groove sharpened, 1= no, 2=yes */
UfDRollActualShimpsTop float32 /* thickness chock shim top roll */
UfDRollActualShimpsBot float32 /* thickness chock shim bottom ro */
UfDRollThrustPlate float32 /* thickness of thrust plate betw */
}
func (uf *L2Uf) FillTelegram(rolldata *api.UfRollData) {
size := unsafe.Sizeof(uf)
uf.TelegramHeader = &TelegramHeader{
MessageLength: int16(size),
TelegramID: 9001,
SequenceCounter: 0,
Flags: 0,
TimeStamp: [8]int16{},
}
copy(uf.UfRollSetId[:], []byte(rolldata.GetUfRollSetId()))
uf.UfRollSetType = int32(rolldata.GetUfRollSetType())
uf.UfTonnageAccum[0] = float32(rolldata.GetUfTonnageAccum0())
uf.UfTonnageAccum[1] = float32(rolldata.GetUfTonnageAccum1())
uf.UfTonnageAccum[2] = float32(rolldata.GetUfTonnageAccum2())
uf.UfTonnageAccum[3] = float32(rolldata.GetUfTonnageAccum3())
uf.UfTonnageAccum[4] = float32(rolldata.GetUfTonnageAccum4())
uf.UfTonnageAccum[5] = float32(rolldata.GetUfTonnageAccum5())
uf.UfTonnageAccum[6] = float32(rolldata.GetUfTonnageAccum6())
uf.UfTonnageAccum[7] = float32(rolldata.GetUfTonnageAccum7())
uf.UfTonnageAccum[8] = float32(rolldata.GetUfTonnageAccum8())
uf.UfTonnageAccum[9] = float32(rolldata.GetUfTonnageAccum9())
uf.UfChangeSleeveLength = float32(rolldata.GetUfChangeSleeveLength())
uf.UfChangeSleeveDepth = float32(rolldata.GetUfChangeSleeveLength())
uf.UfHrChangedFlag = 0 // ????????????????????????????????????????????
uf.UfVrChangedFlag = 0 // ????????????????????????????????????????????
copy(uf.UfRollMaterialH[:], []byte(rolldata.GetUfRollMaterialH()))
copy(uf.UfRollMaterialV[:], []byte(rolldata.GetUfRollMaterialV()))
uf.UfHNomGap = float32(rolldata.GetUfHNomgap())
uf.UfRollDiamActHbo = float32(rolldata.GetUfRollDiamActHbo())
uf.UfRollDiamActHtp = float32(rolldata.GetUfRollDiamActHtp())
uf.UfRollBarrelWidthHbo = float32(rolldata.GetUfRollBarrelWidthHbo())
uf.UfRollBarrelWidthHtp = float32(rolldata.GetUfRollBarrelWidthHtp())
uf.UfRollChamWidthHbo = float32(rolldata.GetUfRollChamWidthHbo())
uf.UfRollChamWidthHtp = float32(rolldata.GetUfRollChamWidthHtp())
uf.UfRollAngleHbo = float32(rolldata.GetUfRollAngleHbo())
uf.UfRollAngleHtb = float32(rolldata.GetUfRollAngleHtb())
uf.UfRollDiamActVds = float32(rolldata.GetUfRollDiamActVds())
uf.UfRollDiamActVos = float32(rolldata.GetUfRollDiamActVos())
uf.UfRollAngleVds = float32(rolldata.GetUfRollAngleVds())
uf.UfRollAngleVos = float32(rolldata.GetUfRollAngleVos())
uf.UfActualShimpsHbo = float32(rolldata.GetUfActualShimpsHbo())
uf.UfActualShimpsHtp = float32(rolldata.GetUfActualShimpsHtp())
uf.UfActualShimpsVDS1 = float32(rolldata.GetUfActualShimpsVds_1())
uf.UfActualShimpsVDS2 = float32(rolldata.GetUfActualShimpsVds_2())
uf.UfActualShimpsVOS1 = float32(rolldata.GetUfActualShimpsVos_1())
uf.UfActualShimpsVOS2 = float32(rolldata.GetUfActualShimpsVos_2())
uf.UfPasslineOffset = float32(rolldata.GetUfPasslineOffset())
uf.UfPinVChock = float32(rolldata.GetUfPinVChock())
uf.UfDummyVal1 = 0
uf.UfDummyVal2 = 0
uf.UfDummyVal3 = 0
uf.UfDummyVal4 = 0
copy(uf.UfDRollMaterial[:], []byte(rolldata.GetUfRollMaterialH())) // ????????????????????
uf.UfDRollDiamNomActTop = float32(rolldata.GetUfRollDiamActHtp())
uf.UfDRollDiamNomActBot = float32(rolldata.GetUfRollDiamActHbo())
uf.UfDRollNominalGap = float32(rolldata.GetUfHNomgap())
uf.UfDRollGrooves = int32(rolldata.GetUfRollGrooves())
uf.UfDRollGrooveWidth[0] = float32(rolldata.GetUfRollGrooveWidth0())
uf.UfDRollGrooveWidth[1] = float32(rolldata.GetUfRollGrooveWidth1())
uf.UfDRollGrooveWidth[2] = float32(rolldata.GetUfRollGrooveWidth2())
uf.UfDRollGrooveWidth[3] = float32(rolldata.GetUfRollGrooveWidth3())
uf.UfDRollGrooveWidth[4] = float32(rolldata.GetUfRollGrooveWidth4())
uf.UfDRollGrooveWidth[5] = float32(rolldata.GetUfRollGrooveWidth5())
uf.UfDRollGrooveWidth[6] = float32(rolldata.GetUfRollGrooveWidth6())
uf.UfDRollGrooveWidth[7] = float32(rolldata.GetUfRollGrooveWidth7())
uf.UfDRollGrooveWidth[8] = float32(rolldata.GetUfRollGrooveWidth8())
uf.UfDRollGrooveWidth[9] = float32(rolldata.GetUfRollGrooveWidth9())
uf.UfDRollGrooveStiffnessTop[0] = float32(rolldata.GetUfRollGrooveStiffnessTop0())
uf.UfDRollGrooveStiffnessTop[1] = float32(rolldata.GetUfRollGrooveStiffnessTop1())
uf.UfDRollGrooveStiffnessTop[2] = float32(rolldata.GetUfRollGrooveStiffnessTop2())
uf.UfDRollGrooveStiffnessTop[3] = float32(rolldata.GetUfRollGrooveStiffnessTop3())
uf.UfDRollGrooveStiffnessTop[4] = float32(rolldata.GetUfRollGrooveStiffnessTop4())
uf.UfDRollGrooveStiffnessTop[5] = float32(rolldata.GetUfRollGrooveStiffnessTop5())
uf.UfDRollGrooveStiffnessTop[6] = float32(rolldata.GetUfRollGrooveStiffnessTop6())
uf.UfDRollGrooveStiffnessTop[7] = float32(rolldata.GetUfRollGrooveStiffnessTop7())
uf.UfDRollGrooveStiffnessTop[8] = float32(rolldata.GetUfRollGrooveStiffnessTop8())
uf.UfDRollGrooveStiffnessTop[9] = float32(rolldata.GetUfRollGrooveStiffnessTop9())
uf.UfDRollGrooveStiffnessBot[0] = float32(rolldata.GetUfRollGrooveStiffnessBot0())
uf.UfDRollGrooveStiffnessBot[1] = float32(rolldata.GetUfRollGrooveStiffnessBot1())
uf.UfDRollGrooveStiffnessBot[2] = float32(rolldata.GetUfRollGrooveStiffnessBot2())
uf.UfDRollGrooveStiffnessBot[3] = float32(rolldata.GetUfRollGrooveStiffnessBot3())
uf.UfDRollGrooveStiffnessBot[4] = float32(rolldata.GetUfRollGrooveStiffnessBot4())
uf.UfDRollGrooveStiffnessBot[5] = float32(rolldata.GetUfRollGrooveStiffnessBot5())
uf.UfDRollGrooveStiffnessBot[6] = float32(rolldata.GetUfRollGrooveStiffnessBot6())
uf.UfDRollGrooveStiffnessBot[7] = float32(rolldata.GetUfRollGrooveStiffnessBot7())
uf.UfDRollGrooveStiffnessBot[8] = float32(rolldata.GetUfRollGrooveStiffnessBot8())
uf.UfDRollGrooveStiffnessBot[9] = float32(rolldata.GetUfRollGrooveStiffnessBot9())
uf.UfDRollGroovePos[0] = float32(rolldata.GetUfRollGroovePos0())
uf.UfDRollGroovePos[1] = float32(rolldata.GetUfRollGroovePos1())
uf.UfDRollGroovePos[2] = float32(rolldata.GetUfRollGroovePos2())
uf.UfDRollGroovePos[3] = float32(rolldata.GetUfRollGroovePos3())
uf.UfDRollGroovePos[4] = float32(rolldata.GetUfRollGroovePos4())
uf.UfDRollGroovePos[5] = float32(rolldata.GetUfRollGroovePos5())
uf.UfDRollGroovePos[6] = float32(rolldata.GetUfRollGroovePos6())
uf.UfDRollGroovePos[7] = float32(rolldata.GetUfRollGroovePos7())
uf.UfDRollGroovePos[8] = float32(rolldata.GetUfRollGroovePos8())
uf.UfDRollGroovePos[9] = float32(rolldata.GetUfRollGroovePos9())
uf.UfDRollGrooveSharp[0] = int32(rolldata.GetUfRollGrooveSharp0())
uf.UfDRollGrooveSharp[1] = int32(rolldata.GetUfRollGrooveSharp1())
uf.UfDRollGrooveSharp[2] = int32(rolldata.GetUfRollGrooveSharp2())
uf.UfDRollGrooveSharp[3] = int32(rolldata.GetUfRollGrooveSharp3())
uf.UfDRollGrooveSharp[4] = int32(rolldata.GetUfRollGrooveSharp4())
uf.UfDRollGrooveSharp[5] = int32(rolldata.GetUfRollGrooveSharp5())
uf.UfDRollGrooveSharp[6] = int32(rolldata.GetUfRollGrooveSharp6())
uf.UfDRollGrooveSharp[7] = int32(rolldata.GetUfRollGrooveSharp7())
uf.UfDRollGrooveSharp[8] = int32(rolldata.GetUfRollGrooveSharp8())
uf.UfDRollGrooveSharp[9] = int32(rolldata.GetUfRollGrooveSharp9())
uf.UfDRollActualShimpsTop = float32(rolldata.GetUfActualShimpsHtp())
uf.UfDRollActualShimpsBot = float32(rolldata.GetUfActualShimpsHbo())
uf.UfDRollThrustPlate = float32(rolldata.GetUfRollThrustPlate())
}
func (uf *L2Uf) ToBytes() ([]byte, error) {
bs := make([]byte, unsafe.Sizeof(uf))
buffer := bytes.NewBuffer(bs)
if err := binary.Write(buffer, binary.LittleEndian, uf); err != nil {
return nil, err
}
return buffer.Bytes(), nil
}

181
internal/types/ur.go Normal file
View File

@ -0,0 +1,181 @@
package types
import (
"bytes"
"encoding/binary"
"unsafe"
"git.espin.casa/albert/cml04-gdm-int/pkg/api"
)
type L2Ur struct {
TelegramHeader *TelegramHeader
UrRollSetId [20]byte /* roll set identification */
UrRollSetType int32 /* roll set type, 1=DUO,2=UNI */
UrTonnageAccum [10]float32 /* tonnage accumulated per groove */
UrChangeSleeveLength float32 /* length of the roll changing ca */
UrChangeSleeveDepth float32 /* depth of the roll changing car */
UrHrChangedFlag int32 /* changed flag horizontal roll, */
UrVrChangedFlag int32 /* changed flag vertical roll, 0= */
UrRollMaterialH [20]byte /* roll material horizontal rolls */
UrRollMaterialV [20]byte /* roll material vertical rolls */
UrHNomGap float32 /* nominal gap (from roll drawing */
UrRollDiamActHbo float32 /* actual nominal diameter bottom */
UrRollDiamActHtp float32 /* actual nominal diameter top ro */
UrRollBarrelWidthHbo float32 /* barrel width bottom roll */
UrRollBarrelWidthHtp float32 /* barrel width top roll */
UrRollChamWidthHbo float32 /* chamber width bottom roll */
UrRollChamWidthHtp float32 /* chamber width top roll */
UrRollAngleHbo float32 /* angle roll flange face bottom */
UrRollAngleHtb float32 /* angle roll flange face top rol */
UrRollDiamActVds float32 /* actual nominal vertical roll d */
UrRollDiamActVos float32 /* actual nominal vertical roll d */
UrRollAngleVds float32 /* roll angle flange face (vertic */
UrRollAngleVos float32 /* roll angle flange face (vertic */
UrActualShimpsHbo float32 /* thickness shimplate hor. botto */
UrActualShimpsHtp float32 /* thickness shimplate hor. top r */
UrActualShimpsVDS1 float32 /* thickness shimplate 1 drive si */
UrActualShimpsVDS2 float32 /* thickness shimplate 2 drive si */
UrActualShimpsVOS1 float32 /* thickness shimplate 1 oper. Si */
UrActualShimpsVOS2 float32 /* thickness shimplate 2 oper. Si */
UrPasslineOffset float32 /* passline offset */
UrPinVChock float32 /* pin between horizontal and ver */
UrDummyVal1 float32 /* Placeholder for Extensions */
UrDummyVal2 float32 /* Placeholder for Extensions */
UrDummyVal3 float32 /* Placeholder for Extensions */
UrDummyVal4 float32 /* Placeholder for Extensions */
UrDRollMaterial [20]byte /* roll material type (H = Hard, */
UrDRollDiamNomActTop float32 /* actual nominal diameter of top */
UrDRollDiamNomActBot float32 /* actual nominal diameter of bot */
UrDRollNominalGap float32 /* nominal roll gap */
UrDRollGrooves int32 /* number of grooves (equal for t */
UrDRollGrooveWidth [10]float32 /* groove width of each groove (e */
UrDRollGrooveStiffnessTop [10]float32 /* stiffness of each groove (top */
UrDRollGrooveStiffnessBot [10]float32 /* stiffness of each groove (bott */
UrDRollGroovePos [10]float32 /* groove position, the position */
UrDRollGrooveSharp [10]int32 /* groove sharpened, 1= no, 2=yes */
UrDRollActualShimpsTop float32 /* thickness chock shim top roll */
UrDRollActualShimpsBot float32 /* thickness chock shim bottom ro */
UrDRollThrustPlate float32 /* thickness of thrust plate betw */
}
func (ur *L2Ur) FillTelegram(rolldata *api.UrRollData) {
size := unsafe.Sizeof(ur)
ur.TelegramHeader = &TelegramHeader{
MessageLength: int16(size),
TelegramID: 9001,
SequenceCounter: 0,
Flags: 0,
TimeStamp: [8]int16{},
}
copy(ur.UrRollSetId[:], []byte(rolldata.GetUrRollSetId()))
ur.UrRollSetType = int32(rolldata.GetUrRollSetType())
ur.UrTonnageAccum[0] = float32(rolldata.GetUrTonnageAccum0())
ur.UrTonnageAccum[1] = float32(rolldata.GetUrTonnageAccum1())
ur.UrTonnageAccum[2] = float32(rolldata.GetUrTonnageAccum2())
ur.UrTonnageAccum[3] = float32(rolldata.GetUrTonnageAccum3())
ur.UrTonnageAccum[4] = float32(rolldata.GetUrTonnageAccum4())
ur.UrTonnageAccum[5] = float32(rolldata.GetUrTonnageAccum5())
ur.UrTonnageAccum[6] = float32(rolldata.GetUrTonnageAccum6())
ur.UrTonnageAccum[7] = float32(rolldata.GetUrTonnageAccum7())
ur.UrTonnageAccum[8] = float32(rolldata.GetUrTonnageAccum8())
ur.UrTonnageAccum[9] = float32(rolldata.GetUrTonnageAccum9())
ur.UrChangeSleeveLength = float32(rolldata.GetUrChangeSleeveLength())
ur.UrChangeSleeveDepth = float32(rolldata.GetUrChangeSleeveLength())
ur.UrHrChangedFlag = 0 // ????????????????????????????????????????????
ur.UrVrChangedFlag = 0 // ????????????????????????????????????????????
copy(ur.UrRollMaterialH[:], []byte(rolldata.GetUrRollMaterialH()))
copy(ur.UrRollMaterialV[:], []byte(rolldata.GetUrRollMaterialV()))
ur.UrHNomGap = float32(rolldata.GetUrHNomgap())
ur.UrRollDiamActHbo = float32(rolldata.GetUrRollDiamActHbo())
ur.UrRollDiamActHtp = float32(rolldata.GetUrRollDiamActHtp())
ur.UrRollBarrelWidthHbo = float32(rolldata.GetUrRollBarrelWidthHbo())
ur.UrRollBarrelWidthHtp = float32(rolldata.GetUrRollBarrelWidthHtp())
ur.UrRollChamWidthHbo = float32(rolldata.GetUrRollChamWidthHbo())
ur.UrRollChamWidthHtp = float32(rolldata.GetUrRollChamWidthHtp())
ur.UrRollAngleHbo = float32(rolldata.GetUrRollAngleHbo())
ur.UrRollAngleHtb = float32(rolldata.GetUrRollAngleHtb())
ur.UrRollDiamActVds = float32(rolldata.GetUrRollDiamActVds())
ur.UrRollDiamActVos = float32(rolldata.GetUrRollDiamActVos())
ur.UrRollAngleVds = float32(rolldata.GetUrRollAngleVds())
ur.UrRollAngleVos = float32(rolldata.GetUrRollAngleVos())
ur.UrActualShimpsHbo = float32(rolldata.GetUrActualShimpsHbo())
ur.UrActualShimpsHtp = float32(rolldata.GetUrActualShimpsHtp())
ur.UrActualShimpsVDS1 = float32(rolldata.GetUrActualShimpsVds_1())
ur.UrActualShimpsVDS2 = float32(rolldata.GetUrActualShimpsVds_2())
ur.UrActualShimpsVOS1 = float32(rolldata.GetUrActualShimpsVos_1())
ur.UrActualShimpsVOS2 = float32(rolldata.GetUrActualShimpsVos_2())
ur.UrPasslineOffset = float32(rolldata.GetUrPasslineOffset())
ur.UrPinVChock = float32(rolldata.GetUrPinVChock())
ur.UrDummyVal1 = 0
ur.UrDummyVal2 = 0
ur.UrDummyVal3 = 0
ur.UrDummyVal4 = 0
copy(ur.UrDRollMaterial[:], []byte(rolldata.GetUrRollMaterialH())) // ????????????????????
ur.UrDRollDiamNomActTop = float32(rolldata.GetUrRollDiamActHtp())
ur.UrDRollDiamNomActBot = float32(rolldata.GetUrRollDiamActHbo())
ur.UrDRollNominalGap = float32(rolldata.GetUrHNomgap())
ur.UrDRollGrooves = int32(rolldata.GetUrRollGrooves())
ur.UrDRollGrooveWidth[0] = float32(rolldata.GetUrRollGrooveWidth0())
ur.UrDRollGrooveWidth[1] = float32(rolldata.GetUrRollGrooveWidth1())
ur.UrDRollGrooveWidth[2] = float32(rolldata.GetUrRollGrooveWidth2())
ur.UrDRollGrooveWidth[3] = float32(rolldata.GetUrRollGrooveWidth3())
ur.UrDRollGrooveWidth[4] = float32(rolldata.GetUrRollGrooveWidth4())
ur.UrDRollGrooveWidth[5] = float32(rolldata.GetUrRollGrooveWidth5())
ur.UrDRollGrooveWidth[6] = float32(rolldata.GetUrRollGrooveWidth6())
ur.UrDRollGrooveWidth[7] = float32(rolldata.GetUrRollGrooveWidth7())
ur.UrDRollGrooveWidth[8] = float32(rolldata.GetUrRollGrooveWidth8())
ur.UrDRollGrooveWidth[9] = float32(rolldata.GetUrRollGrooveWidth9())
ur.UrDRollGrooveStiffnessTop[0] = float32(rolldata.GetUrRollGrooveStiffnessTop0())
ur.UrDRollGrooveStiffnessTop[1] = float32(rolldata.GetUrRollGrooveStiffnessTop1())
ur.UrDRollGrooveStiffnessTop[2] = float32(rolldata.GetUrRollGrooveStiffnessTop2())
ur.UrDRollGrooveStiffnessTop[3] = float32(rolldata.GetUrRollGrooveStiffnessTop3())
ur.UrDRollGrooveStiffnessTop[4] = float32(rolldata.GetUrRollGrooveStiffnessTop4())
ur.UrDRollGrooveStiffnessTop[5] = float32(rolldata.GetUrRollGrooveStiffnessTop5())
ur.UrDRollGrooveStiffnessTop[6] = float32(rolldata.GetUrRollGrooveStiffnessTop6())
ur.UrDRollGrooveStiffnessTop[7] = float32(rolldata.GetUrRollGrooveStiffnessTop7())
ur.UrDRollGrooveStiffnessTop[8] = float32(rolldata.GetUrRollGrooveStiffnessTop8())
ur.UrDRollGrooveStiffnessTop[9] = float32(rolldata.GetUrRollGrooveStiffnessTop9())
ur.UrDRollGrooveStiffnessBot[0] = float32(rolldata.GetUrRollGrooveStiffnessBot0())
ur.UrDRollGrooveStiffnessBot[1] = float32(rolldata.GetUrRollGrooveStiffnessBot1())
ur.UrDRollGrooveStiffnessBot[2] = float32(rolldata.GetUrRollGrooveStiffnessBot2())
ur.UrDRollGrooveStiffnessBot[3] = float32(rolldata.GetUrRollGrooveStiffnessBot3())
ur.UrDRollGrooveStiffnessBot[4] = float32(rolldata.GetUrRollGrooveStiffnessBot4())
ur.UrDRollGrooveStiffnessBot[5] = float32(rolldata.GetUrRollGrooveStiffnessBot5())
ur.UrDRollGrooveStiffnessBot[6] = float32(rolldata.GetUrRollGrooveStiffnessBot6())
ur.UrDRollGrooveStiffnessBot[7] = float32(rolldata.GetUrRollGrooveStiffnessBot7())
ur.UrDRollGrooveStiffnessBot[8] = float32(rolldata.GetUrRollGrooveStiffnessBot8())
ur.UrDRollGrooveStiffnessBot[9] = float32(rolldata.GetUrRollGrooveStiffnessBot9())
ur.UrDRollGroovePos[0] = float32(rolldata.GetUrRollGroovePos0())
ur.UrDRollGroovePos[1] = float32(rolldata.GetUrRollGroovePos1())
ur.UrDRollGroovePos[2] = float32(rolldata.GetUrRollGroovePos2())
ur.UrDRollGroovePos[3] = float32(rolldata.GetUrRollGroovePos3())
ur.UrDRollGroovePos[4] = float32(rolldata.GetUrRollGroovePos4())
ur.UrDRollGroovePos[5] = float32(rolldata.GetUrRollGroovePos5())
ur.UrDRollGroovePos[6] = float32(rolldata.GetUrRollGroovePos6())
ur.UrDRollGroovePos[7] = float32(rolldata.GetUrRollGroovePos7())
ur.UrDRollGroovePos[8] = float32(rolldata.GetUrRollGroovePos8())
ur.UrDRollGroovePos[9] = float32(rolldata.GetUrRollGroovePos9())
ur.UrDRollGrooveSharp[0] = int32(rolldata.GetUrRollGrooveSharp0())
ur.UrDRollGrooveSharp[1] = int32(rolldata.GetUrRollGrooveSharp1())
ur.UrDRollGrooveSharp[2] = int32(rolldata.GetUrRollGrooveSharp2())
ur.UrDRollGrooveSharp[3] = int32(rolldata.GetUrRollGrooveSharp3())
ur.UrDRollGrooveSharp[4] = int32(rolldata.GetUrRollGrooveSharp4())
ur.UrDRollGrooveSharp[5] = int32(rolldata.GetUrRollGrooveSharp5())
ur.UrDRollGrooveSharp[6] = int32(rolldata.GetUrRollGrooveSharp6())
ur.UrDRollGrooveSharp[7] = int32(rolldata.GetUrRollGrooveSharp7())
ur.UrDRollGrooveSharp[8] = int32(rolldata.GetUrRollGrooveSharp8())
ur.UrDRollGrooveSharp[9] = int32(rolldata.GetUrRollGrooveSharp9())
ur.UrDRollActualShimpsTop = float32(rolldata.GetUrActualShimpsHtp())
ur.UrDRollActualShimpsBot = float32(rolldata.GetUrActualShimpsHbo())
ur.UrDRollThrustPlate = float32(rolldata.GetUrRollThrustPlate())
}
func (ur *L2Ur) ToBytes() ([]byte, error) {
bs := make([]byte, unsafe.Sizeof(ur))
buffer := bytes.NewBuffer(bs)
if err := binary.Write(buffer, binary.LittleEndian, ur); err != nil {
return nil, err
}
return buffer.Bytes(), nil
}