1 Star 0 Fork 0

cmtba/virtual

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
virtualdriver.go 59.54 KB
一键复制 编辑 原始数据 按行查看 历史
huienming 提交于 2021-07-23 09:57 +08:00 . 修改了参数的bug
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975
package driver
import (
"fmt"
"io"
"io/ioutil"
"math"
"os"
"os/exec"
"strconv"
"strings"
nclinkmodel "gitee.com/cmtba/nclink/models"
)
type getFunc func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool)
type setFunc func(item nclinkmodel.SetItem, virtualDevice *virtualMachine) (*nclinkmodel.SetItem, bool)
type sampleFunc func(n uint64, virtualDevice *virtualMachine) (interface{}, bool)
type driverItem struct {
PrivilegeLevel int
Get getFunc
Set setFunc
Sample sampleFunc
}
type fileAttrib struct {
Type string `json:"type"`
Size int64 `json:"size"`
ChangeTime string `json:"changeTime"`
}
type toolParam struct {
Length *float32 `json:"length,omitempty"`
Radius *float32 `json:"radius"`
LengthAbrasion *float32 `json:"length_abrasion,omitempty"`
RadiusAbrasion *float32 `json:"radius_abrasion,omitempty"`
}
type crd struct {
X *float32 `json:"x,omitempty"`
Y *float32 `json:"y,omitempty"`
Z *float32 `json:"z,omitempty"`
C *float32 `json:"c,omitempty"`
}
type axis struct {
Name string
Number int
Type string
ActSpeed float32
CmdSpeed float32
ActPosition float32
CmdPosition float32
Current float32
}
const (
actpos = 0
cmdpos = 1
actspeed = 2
cmdspeed = 3
current = 4
)
type runState struct {
line uint64
state int64
progNumber int64
toolNumber int64
}
var statusS = []string{"free", "running", "holding"}
var statusN = []int{0, 1, 2}
var drivers map[string]*driverItem
func init() {
drivers = make(map[string]*driverItem)
dataPool := new([100][1000]float32) //预先生成100组,每组10000个点的数据,采样数据直接从这里面取
for i := 0; i < 100; i++ {
for j := 0; j < 1000; j++ {
dataPool[i][j] = float32(int32(float64(i+1)*100000.0*math.Sin(3.14*2.0*float64(j)/200.0))) / 10000.0
}
}
drivers["NC_LINK_ROOT:MACHINE:STATUS"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
var status string
switch virtualDevice.RunState.state {
case 0:
status = "running"
case 1:
status = "free"
case 2:
status = "holding"
default:
response.Code = nclinkmodel.NG
return response, false
}
response.Values = append(response.Values, status)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
var status int
if len(virtualDevice.ProgList) == 0 {
status = 1
} else {
status = statusN[int(virtualDevice.SampleHeartBeat/300000)%len(statusS)]
}
for i := uint64(0); i < n; i++ {
virtualDevice.SampleBuffer.Status[i] = status
}
virtualDevice.RunState.state = int64(status)
return virtualDevice.SampleBuffer.Status[0:n], true
},
}
drivers["NC_LINK_ROOT:MACHINE:FEED_SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
var v uint32
switch virtualDevice.RunState.state {
case 0:
v = 3000
case 1, 2:
v = 0
default:
response.Code = nclinkmodel.NG
return response, false
}
response.Values = append(response.Values, v)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]uint32, n)
var status int
if len(virtualDevice.ProgList) == 0 {
status = 1
} else {
status = statusN[int(virtualDevice.SampleHeartBeat/300000)%len(statusS)]
}
var v uint32
switch status {
case 0:
v = 3000
default:
v = 0
}
for i := uint64(0); i < n; i++ {
data[i] = v
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:FEED_OVERRIDE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, 100)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]uint32, n)
for i := uint64(0); i < n; i++ {
data[i] = 100
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:SPDL_OVERRIDE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, 100)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]uint32, n)
for i := uint64(0); i < n; i++ {
data[i] = 100
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:PART_COUNT"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, virtualDevice.SampleHeartBeat/300000)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]uint32, n)
for i := uint64(0); i < n; i++ {
data[i] = uint32((virtualDevice.SampleHeartBeat + i) / 300000)
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:WARNING"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, []int{})
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([][]uint32, n)
for i := uint64(0); i < n; i++ {
data[i] = []uint32{}
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:WARNING"] = drivers["NC_LINK_ROOT:MACHINE:WARNING"]
funcGetAxisValue := func(axis int, dataindex int, item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
var targetdata *float32
switch dataindex {
case actpos:
targetdata = &virtualDevice.Axes[axis].ActPosition
case cmdpos:
targetdata = &virtualDevice.Axes[axis].CmdPosition
case actspeed:
targetdata = &virtualDevice.Axes[axis].ActSpeed
case cmdspeed:
targetdata = &virtualDevice.Axes[axis].CmdSpeed
case current:
targetdata = &virtualDevice.Axes[axis].Current
}
switch operation {
case nclinkmodel.OP_get_value:
*targetdata = dataPool[axis*5+dataindex][virtualDevice.SampleHeartBeat%1000]
response.Values = append(response.Values, *targetdata)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
funcGetAxisName := func(axis int, item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, virtualDevice.Axes[axis].Name)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
funcGetAxisType := func(axis int, item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, virtualDevice.Axes[axis].Type)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
funcGetAxisNumber := func(axis int, item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, virtualDevice.Axes[axis].Number)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
funcAxisSample := func(axis int, dataindex int, n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
var status int
if len(virtualDevice.ProgList) == 0 {
status = 1
} else {
status = statusN[int(virtualDevice.SampleHeartBeat/300000)%len(statusS)]
}
var targetdata *float32
switch dataindex {
case actpos:
targetdata = &virtualDevice.Axes[axis].ActPosition
case cmdpos:
targetdata = &virtualDevice.Axes[axis].CmdPosition
case actspeed:
targetdata = &virtualDevice.Axes[axis].ActSpeed
case cmdspeed:
targetdata = &virtualDevice.Axes[axis].CmdSpeed
case current:
targetdata = &virtualDevice.Axes[axis].Current
}
switch status {
case 0:
s := virtualDevice.SampleHeartBeat % 1000
for i := s; i < s+n; i++ {
virtualDevice.SampleBuffer.Axis[axis][dataindex][i-s] = dataPool[axis*5+dataindex][i%1000]
}
*targetdata = dataPool[axis*5+dataindex][(s+n-1)%1000]
case 1, 2:
v := *targetdata
for i := uint64(0); i < n; i++ {
virtualDevice.SampleBuffer.Axis[axis][dataindex][i] = float32(v)
}
default:
}
return virtualDevice.SampleBuffer.Axis[axis][dataindex][0:n], true
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:NAME"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisName(0, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:TYPE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisType(0, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:NUMBER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisNumber(0, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:SCREW:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(0, actpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(0, actpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:SCREW:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(0, actspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(0, actspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:SERVO_DRIVER:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(0, cmdpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(0, cmdpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:SERVO_DRIVER:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(0, cmdspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(0, cmdspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#0:MOTOR:CURRENT"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(0, current, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(0, current, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:NAME"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisName(1, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:TYPE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisType(1, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:NUMBER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisNumber(1, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:SCREW:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(1, actpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(1, actpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:SCREW:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(1, actspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(1, actspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:SERVO_DRIVER:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(1, cmdpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(1, cmdpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:SERVO_DRIVER:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(1, cmdspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(1, cmdspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#1:MOTOR:CURRENT"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(1, current, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(1, current, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:NAME"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisName(2, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:TYPE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisType(2, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:NUMBER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisNumber(2, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:SCREW:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(2, actpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(2, actpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:SCREW:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(2, actspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(2, actspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:SERVO_DRIVER:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(2, cmdpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(2, cmdpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:SERVO_DRIVER:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(2, cmdspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(2, cmdspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#2:MOTOR:CURRENT"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(2, current, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(2, current, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:NAME"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisName(5, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:TYPE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisType(5, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:NUMBER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisNumber(5, item, virtualDevice)
},
Set: nil,
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:MOTOR:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(5, actspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(5, actspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:MOTOR:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(5, actpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(5, actpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:SERVO_DRIVER:POSITION"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(5, cmdpos, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(5, cmdpos, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:SERVO_DRIVER:SPEED"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(5, cmdspeed, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(5, cmdspeed, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:AXIS#5:MOTOR:CURRENT"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
return funcGetAxisValue(5, current, item, virtualDevice)
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
return funcAxisSample(5, current, n, virtualDevice)
},
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:LINE_NUMBER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, virtualDevice.RunState.line)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]uint32, n)
var status int
if len(virtualDevice.ProgList) == 0 {
status = 1
} else {
status = statusN[int(virtualDevice.SampleHeartBeat/300000)%len(statusS)]
}
var v uint64
switch status {
case 0:
progNumber := (virtualDevice.SampleHeartBeat / 300000) % uint64(len(virtualDevice.ProgList))
if virtualDevice.ProgList[progNumber].lineNumber == 0 {
v = 0
} else {
v = (virtualDevice.SampleHeartBeat / 300) % uint64(virtualDevice.ProgList[progNumber].lineNumber)
}
virtualDevice.RunState.line = v
case 1:
v = virtualDevice.RunState.line
default:
v = 0
}
for i := uint64(0); i < n; i++ {
data[i] = uint32(v)
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:PROGRAM_NUMBER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, virtualDevice.RunState.progNumber)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]uint32, n)
var status int
if len(virtualDevice.ProgList) == 0 {
status = 1
} else {
status = statusN[int(virtualDevice.SampleHeartBeat/300000)%len(statusS)]
}
var v uint64
switch status {
case 0:
v = (virtualDevice.SampleHeartBeat / 300000) % uint64(len(virtualDevice.ProgList))
virtualDevice.RunState.progNumber = int64(v)
default:
v = uint64(virtualDevice.RunState.progNumber)
}
for i := uint64(0); i < n; i++ {
data[i] = uint32(v)
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:TOOL_NUMBER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
response.Values = append(response.Values, virtualDevice.RunState.toolNumber)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]uint32, n)
var status int
if len(virtualDevice.ProgList) == 0 {
status = 1
} else {
status = statusN[int(virtualDevice.SampleHeartBeat/300000)%len(statusS)]
}
var v uint64
switch status {
case 0:
v = virtualDevice.SampleHeartBeat / 30000
virtualDevice.RunState.toolNumber = int64(v)
default:
v = uint64(virtualDevice.RunState.toolNumber)
}
for i := uint64(0); i < n; i++ {
data[i] = uint32(v)
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:TOOL_PARAM"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
if item.Params == nil {
response.Code = nclinkmodel.NG
return response, false
}
response.Params.Operation = item.Params.Operation
indexes := item.Params.Indexes
if len(indexes) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
response.Params.Indexes = indexes
for _, indexStr := range indexes {
indexN := strings.Split(indexStr, "-")
switch len(indexN) {
case 1:
index, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
if index < 0 || index >= len(virtualDevice.ToolParam) {
response.Code = nclinkmodel.NG
return response, false
} else {
response.Values = append(response.Values, virtualDevice.ToolParam[index])
}
case 2:
index0, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
index1, err := strconv.Atoi(indexN[1])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
for index := index0; index <= index1; index++ {
if index < 0 || index >= len(virtualDevice.ToolParam) {
response.Code = nclinkmodel.NG
return response, false
} else {
response.Values = append(response.Values, virtualDevice.ToolParam[index])
}
}
default:
response.Code = nclinkmodel.NG
return response, false
}
}
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_length:
response.Values = append(response.Values, len(virtualDevice.ToolParam))
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: func(item nclinkmodel.SetItem, virtualDevice *virtualMachine) (item2 *nclinkmodel.SetItem, b bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_set_value
}
switch operation {
case nclinkmodel.OP_set_value:
index := item.Params.Index
if index == nil || *index < 0 || *index >= len(virtualDevice.ToolParam) {
response.Code = nclinkmodel.NG
return response, false
}
if item.Params.Value == nil {
response.Code = nclinkmodel.NG
return response, false
}
value, ok := item.Params.Value.(map[string]interface{})
if !ok {
response.Code = nclinkmodel.NG
return response, false
}
for k, v := range value {
switch k {
case "length":
*virtualDevice.ToolParam[*index].Length = float32(v.(float64))
case "radius":
*virtualDevice.ToolParam[*index].Radius = float32(v.(float64))
case "length_abrasion":
*virtualDevice.ToolParam[*index].LengthAbrasion = float32(v.(float64))
case "radius_abrasion":
*virtualDevice.ToolParam[*index].RadiusAbrasion = float32(v.(float64))
}
}
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:PROGRAM"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
if int64(len(virtualDevice.ProgList)) <= virtualDevice.RunState.progNumber {
response.Values = append(response.Values, "")
} else {
response.Values = append(response.Values, virtualDevice.ProgList[virtualDevice.RunState.progNumber].name)
}
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: func(n uint64, virtualDevice *virtualMachine) (interface{}, bool) {
data := make([]string, n)
var status int
if len(virtualDevice.ProgList) == 0 {
status = 1
} else {
status = statusN[int(virtualDevice.SampleHeartBeat/300000)%len(statusS)]
}
var v string
if int64(len(virtualDevice.ProgList)) <= virtualDevice.RunState.progNumber {
v = ""
} else {
v = virtualDevice.ProgList[virtualDevice.RunState.progNumber].name
}
switch status {
case 0:
default:
}
for i := uint64(0); i < n; i++ {
data[i] = v
}
return data, true
},
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:SUBPROGRAM"] = drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:PROGRAM"]
drivers["NC_LINK_ROOT:MACHINE:FILE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
if item.Params == nil {
response.Code = nclinkmodel.NG
return response, false
}
keys := item.Params.Keys
if len(keys) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
offset := item.Params.Offset
length := item.Params.Length
if len(keys) == 0 || offset == nil || length == nil || *offset < 0 || *length <= 0 {
response.Code = nclinkmodel.NG
return response, false
}
for _, key := range keys {
file, err := os.Open(virtualDevice.ProgDir + key)
if err != nil {
response.Values = append(response.Values, nil)
fmt.Printf("Failed to Open File \"%s\"\n", virtualDevice.ProgDir+key)
continue
}
fileinfo, err := file.Stat()
if err != nil || fileinfo.IsDir() || fileinfo.Size() < int64(*offset) {
response.Values = append(response.Values, nil)
file.Close()
continue
}
_offet, err := file.Seek(int64(*offset), 0)
if int64(*offset) != _offet || err != nil {
response.Values = append(response.Values, nil)
file.Close()
continue
}
data := make([]byte, *length)
n, err := file.Read(data)
if err != nil || n <= 0 {
response.Values = append(response.Values, nil)
file.Close()
continue
}
encodedData := make([]byte, n*2)
for i := 0; i < n; i++ {
c0 := (data[i] >> 4) & 0x0f
c1 := data[i] & 0x0f
if c0 > 9 {
encodedData[2*i] = c0 - 10 + 'A'
} else {
encodedData[2*i] = c0 + '0'
}
if c1 > 9 {
encodedData[2*i+1] = c1 - 10 + 'A'
} else {
encodedData[2*i+1] = c1 + '0'
}
}
response.Values = append(response.Values, string(encodedData))
file.Close()
}
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_keys:
prefixLen := len(virtualDevice.ProgDir)
var IterateDir func(dir string) []interface{}
IterateDir = func(dir string) []interface{} {
files := make([]interface{}, 0)
fileInfos, err := ioutil.ReadDir(dir)
if err != nil {
return files
}
for _, fileInfo := range fileInfos {
files = append(files, (dir + fileInfo.Name())[prefixLen:])
if fileInfo.IsDir() {
files = append(files, IterateDir(dir+fileInfo.Name())...)
}
}
return files
}
files := IterateDir(virtualDevice.ProgDir)
response.Values = files
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_attributes:
keys := item.Params.Keys
if len(keys) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
attributes := make([]interface{}, 0)
for _, key := range keys {
fileInfo, err := os.Stat(virtualDevice.ProgDir + key)
if err != nil {
attributes = append(attributes, nil)
continue
}
attr := fileAttrib{}
if fileInfo.IsDir() {
attr.Type = "directory"
} else {
attr.Type = "file"
}
attr.Size = fileInfo.Size()
t := fileInfo.ModTime()
attr.ChangeTime = fmt.Sprintf("%d/%02d/%02d %02d:%02d:%02d", t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
attributes = append(attributes, attr)
}
response.Code = nclinkmodel.OK
response.Values = attributes
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: func(item nclinkmodel.SetItem, virtualDevice *virtualMachine) (*nclinkmodel.SetItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_set_value
}
switch operation {
case nclinkmodel.OP_set_value:
key := item.Params.Key
offset := item.Params.Offset
length := item.Params.Length
if item.Params.Value == nil {
response.Code = nclinkmodel.NG
return response, false
}
if len(key) == 0 || offset == nil || length == nil || *offset < 0 || *length <= 0 {
response.Code = nclinkmodel.NG
return response, false
}
value, ok := item.Params.Value.(string)
if !ok {
response.Code = nclinkmodel.NG
return response, false
}
if len(value) != 2*(*length) {
response.Code = nclinkmodel.NG
return response, false
}
byteValue := []byte(value)
for i := 0; i < len(byteValue); i++ {
if byteValue[i] < '0' || byteValue[i] > 'F' || (byteValue[i] > '9' && byteValue[i] < 'A') {
response.Code = nclinkmodel.NG
return response, false
}
}
file, err := os.OpenFile(virtualDevice.ProgDir+key, os.O_CREATE|os.O_RDWR, 0666)
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
fileinfo, err := file.Stat()
if err != nil || fileinfo.IsDir() {
file.Close()
response.Code = nclinkmodel.NG
return response, false
}
if fileinfo.Size() < int64(*offset) {
_, err := file.Seek(0, io.SeekEnd)
if err != nil {
file.Close()
response.Code = nclinkmodel.NG
return response, false
}
zeros := make([]byte, 1024)
for j := int64(0); j < (int64(*offset)-fileinfo.Size())/1024; j++ {
n, err := file.Write(zeros)
if n != len(zeros) || err != nil {
file.Close()
response.Code = nclinkmodel.NG
return response, false
}
}
n := (int64(*offset) - fileinfo.Size()) % 1024
if n != 0 {
k, err := file.Write(zeros[0:n])
if int64(k) != n || err != nil {
file.Close()
response.Code = nclinkmodel.NG
return response, false
}
}
}
_, err = file.Seek(int64(*offset), io.SeekStart)
if err != nil {
file.Close()
response.Code = nclinkmodel.NG
return response, false
}
bytes := make([]byte, 1024)
var j, k int
for j = 0; j < *length/1024+1; j++ {
for k = 0; k < 1024 && k < *length-j*1024; k++ {
c0 := byteValue[2*(k+1024*j)]
c1 := byteValue[2*(k+1024*j)+1]
if c0 > '9' {
c0 -= 'A'
c0 += 10
}
if c1 > '9' {
c1 -= 'A'
c1 += 10
}
bytes[k] = ((c0 << 4) & 0xf0) | (c1 & 0x0f)
}
if k > 0 {
n, err := file.Write(bytes[0:k])
if err != nil || n != k {
fmt.Printf("Faild to Write File \"%s\":%v\n", virtualDevice.ProgDir+key, err)
}
}
}
file.Close()
response.Code = nclinkmodel.OK
return response, true
case "add":
response.Params.Key = item.Params.Key
key := item.Params.Key
err := os.Mkdir(virtualDevice.ProgDir+key, os.ModePerm)
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
response.Code = nclinkmodel.OK
return response, true
case "delete":
key := item.Params.Key
err := os.Remove(virtualDevice.ProgDir + key)
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:FILE"] = drivers["NC_LINK_ROOT:MACHINE:FILE"]
regDriver := func(reg int) *driverItem {
driver := &driverItem{}
driver.Get = func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
if item.Params == nil {
response.Code = nclinkmodel.NG
return response, false
}
indexes := item.Params.Indexes
if len(indexes) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
for _, indexStr := range indexes {
indexN := strings.Split(indexStr, "-")
switch len(indexN) {
case 1:
index, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
if index < 0 || index >= len(virtualDevice.Regs[reg]) {
response.Values = append(response.Values, nil)
} else {
response.Values = append(response.Values, virtualDevice.Regs[reg][index])
}
case 2:
index0, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
index1, err := strconv.Atoi(indexN[1])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
for index := index0; index <= index1; index++ {
if index < 0 || index >= len(virtualDevice.Regs[reg]) {
response.Values = append(response.Values, nil)
} else {
response.Values = append(response.Values, virtualDevice.Regs[reg][index])
}
}
default:
response.Code = nclinkmodel.NG
return response, false
}
}
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_length:
response.Values = append(response.Values, len(virtualDevice.Regs[reg]))
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
driver.Set = func(item nclinkmodel.SetItem, virtualDevice *virtualMachine) (item2 *nclinkmodel.SetItem, b bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_set_value
}
switch operation {
case nclinkmodel.OP_set_value:
index := item.Params.Index
if item.Params.Value == nil {
response.Code = nclinkmodel.NG
return response, false
}
if index == nil || *index < 0 || *index >= len(virtualDevice.Regs[reg]) {
response.Code = nclinkmodel.NG
return response, false
}
value, ok := item.Params.Value.(float64)
if !ok {
response.Code = nclinkmodel.NG
return response, false
}
virtualDevice.Regs[reg][*index] = uint32(value)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
driver.Sample = nil
return driver
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_X"] = regDriver(0)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_Y"] = regDriver(1)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_F"] = regDriver(2)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_G"] = regDriver(3)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_R"] = regDriver(4)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_B"] = regDriver(5)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_W"] = regDriver(6)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_D"] = regDriver(7)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_P"] = regDriver(8)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_I"] = regDriver(9)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_Q"] = regDriver(10)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_K"] = regDriver(11)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_T"] = regDriver(12)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#REG_C"] = regDriver(13)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:PARAMETER"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, dev *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if dev == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
if item.Params == nil {
response.Code = nclinkmodel.NG
return response, false
}
indexes := item.Params.Indexes
if len(indexes) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
response.Params.Indexes = indexes
for _, indexStr := range indexes {
indexN := strings.Split(indexStr, "-")
switch len(indexN) {
case 1:
index, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
response.Values = append(response.Values, dev.paramGetValue(index))
case 2:
index0, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
index1, err := strconv.Atoi(indexN[1])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
for index := index0; index <= index1; index++ {
response.Values = append(response.Values, dev.paramGetValue(index))
}
default:
response.Code = nclinkmodel.NG
return response, false
}
}
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_length:
response.Values = append(response.Values, dev.paramGetLength())
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_attributes:
if item.Params == nil {
response.Code = nclinkmodel.NG
return response, false
}
indexes := item.Params.Indexes
if len(indexes) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
response.Params.Indexes = indexes
for _, indexStr := range indexes {
indexN := strings.Split(indexStr, "-")
switch len(indexN) {
case 1:
index, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
response.Values = append(response.Values, dev.paramGetAttribute(index))
case 2:
index0, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
index1, err := strconv.Atoi(indexN[1])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
for index := index0; index <= index1; index++ {
response.Values = append(response.Values, dev.paramGetAttribute(index))
}
default:
response.Code = nclinkmodel.NG
return response, false
}
}
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: func(item nclinkmodel.SetItem, dev *virtualMachine) (item2 *nclinkmodel.SetItem, b bool) {
response := &item
if dev == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_set_value
}
switch operation {
case nclinkmodel.OP_set_value:
index := item.Params.Index
if index == nil || *index < 0 {
response.Code = nclinkmodel.NG
return response, false
}
if item.Params.Value == nil {
response.Code = nclinkmodel.NG
return response, false
}
value := item.Params.Value
state := dev.paramSetValue(*index, value)
if state {
response.Code = nclinkmodel.OK
return response, true
} else {
response.Code = nclinkmodel.NG
return response, true
}
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Sample: nil,
}
dataDriver := func(data int) *driverItem {
driver := &driverItem{}
driver.Get = func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
if item.Params == nil {
response.Code = nclinkmodel.NG
return response, false
}
indexes := item.Params.Indexes
if len(indexes) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
response.Params.Indexes = indexes
for _, indexStr := range indexes {
indexN := strings.Split(indexStr, "-")
switch len(indexN) {
case 1:
index, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
if index < 0 || index >= len(axisChanSystemData[data]) {
response.Code = nclinkmodel.NG
return response, false
} else {
response.Values = append(response.Values, axisChanSystemData[data][index])
}
case 2:
index0, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
index1, err := strconv.Atoi(indexN[1])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
for index := index0; index <= index1; index++ {
if index < 0 || index >= len(axisChanSystemData[data]) {
response.Code = nclinkmodel.NG
return response, false
} else {
response.Values = append(response.Values, axisChanSystemData[data][index])
}
}
default:
response.Code = nclinkmodel.NG
return response, false
}
}
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_length:
response.Values = append(response.Values, len(axisChanSystemData[data]))
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
driver.Set = func(item nclinkmodel.SetItem, virtualDevice *virtualMachine) (item2 *nclinkmodel.SetItem, b bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_set_value
}
switch operation {
case nclinkmodel.OP_set_value:
index := item.Params.Index
if item.Params.Value == nil {
response.Code = nclinkmodel.NG
return response, false
}
if index == nil || *index < 0 || *index >= len(axisChanSystemData[data]) {
response.Code = nclinkmodel.NG
return response, false
}
value, ok := item.Params.Value.(float64)
if !ok {
response.Code = nclinkmodel.NG
return response, false
}
axisChanSystemData[data][*index] = uint32(value)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
}
driver.Sample = nil
return driver
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#AXIS_0"] = dataDriver(0)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#AXIS_1"] = dataDriver(1)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#AXIS_2"] = dataDriver(2)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#AXIS_5"] = dataDriver(5)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#CHAN_0"] = dataDriver(6)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#SYS"] = dataDriver(10)
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#VAR_SYS"] = drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#SYS"]
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#VAR_CHAN_0"] = drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#CHAN_0"]
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:COORDINATE"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
if item.Params == nil {
response.Code = nclinkmodel.NG
return response, false
}
indexes := item.Params.Indexes
if len(indexes) == 0 {
response.Code = nclinkmodel.NG
return response, false
}
response.Params.Indexes = indexes
for _, indexStr := range indexes {
indexN := strings.Split(indexStr, "-")
switch len(indexN) {
case 1:
index, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
if index < 0 || index >= len(virtualDevice.Crds) {
response.Code = nclinkmodel.NG
return response, false
} else {
response.Values = append(response.Values, virtualDevice.Crds[index])
}
case 2:
index0, err := strconv.Atoi(indexN[0])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
index1, err := strconv.Atoi(indexN[1])
if err != nil {
response.Code = nclinkmodel.NG
return response, false
}
for index := index0; index <= index1; index++ {
if index < 0 || index >= len(virtualDevice.Crds) {
response.Values = append(response.Values, nil)
} else {
response.Values = append(response.Values, virtualDevice.Crds[index])
}
}
default:
response.Code = nclinkmodel.NG
return response, false
}
}
response.Code = nclinkmodel.OK
return response, true
case nclinkmodel.OP_get_length:
response.Values = append(response.Values, len(virtualDevice.Crds))
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: func(item nclinkmodel.SetItem, virtualDevice *virtualMachine) (item2 *nclinkmodel.SetItem, b bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_set_value
}
switch operation {
case nclinkmodel.OP_set_value:
index := item.Params.Index
if index == nil || *index < 0 || *index >= len(virtualDevice.Crds) {
response.Code = nclinkmodel.NG
return response, false
}
if item.Params.Value == nil {
response.Code = nclinkmodel.NG
return response, false
}
value, ok := item.Params.Value.(map[string]interface{})
if !ok {
response.Code = nclinkmodel.NG
return response, false
}
for k, v := range value {
switch k {
case "x":
*virtualDevice.Crds[*index].X = float32(v.(float64))
case "y":
*virtualDevice.Crds[*index].Y = float32(v.(float64))
case "z":
*virtualDevice.Crds[*index].Z = float32(v.(float64))
case "c":
*virtualDevice.Crds[*index].C = float32(v.(float64))
}
}
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:CONSOLE"] = &driverItem{
PrivilegeLevel: 0,
Get: nil,
Set: func(item nclinkmodel.SetItem, virtualDevice *virtualMachine) (item2 *nclinkmodel.SetItem, b bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_set_value
}
switch operation {
case nclinkmodel.OP_set_value:
if item.Params.Value == nil {
response.Code = nclinkmodel.NG
return response, false
}
value, ok := item.Params.Value.(string)
if !ok {
response.Code = nclinkmodel.NG
return response, false
}
if len(value) == 0 {
response.Code = nclinkmodel.NG
response.Reason = nclinkmodel.Reason_Format_Wrong
} else {
cmds := strings.Split(value, " ")
result, err := exec.Command(cmds[0], cmds[1:]...).Output()
if err == nil {
response.Code = nclinkmodel.OK
response.Reason = string(result)
} else {
response.Code = nclinkmodel.NG
response.Reason = err.Error()
}
}
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Sample: nil,
}
drivers["NC_LINK_ROOT:MACHINE:CONTROLLER:VARIABLE#PROGID_MAP"] = &driverItem{
PrivilegeLevel: 0,
Get: func(item nclinkmodel.QueryItem, virtualDevice *virtualMachine) (*nclinkmodel.QueryItem, bool) {
response := &item
if virtualDevice == nil {
response.Code = nclinkmodel.NG
return response, false
}
var operation string
if item.Params != nil && item.Params.Operation != "" {
operation = item.Params.Operation
} else {
operation = nclinkmodel.OP_get_value
}
switch operation {
case nclinkmodel.OP_get_value:
myMap := map[int]string{}
for i := 0; i < len(virtualDevice.ProgList); i++ {
myMap[i] = virtualDevice.ProgList[i].name
}
response.Values = append(response.Values, myMap)
response.Code = nclinkmodel.OK
return response, true
default:
response.Code = nclinkmodel.NG
return response, false
}
},
Set: nil,
Sample: nil,
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/cmtba/virtual.git
git@gitee.com:cmtba/virtual.git
cmtba
virtual
virtual
b1eaf9284419

搜索帮助