# VSMD

Controller for VSMD can motor

## Debug model

Explained by doc file 
[VSMD1X6_SERIES_V1.0.pdf](https://github.com/JChrysanthemum/VSMD/blob/master/doc/VSMD1X6_SERIES_V1.0.pdf), it's
easy to convert can.message to meaningful frame.

```
bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=500000)

while True:
    for msg in bus:
    print("\n%2d\n" % cnt)

    # set debug = true make it to show inf of can-frame
    can_frame = VsmdCanFrame(msg, debug=True)
```

For an example,say frame 0004079F#0020000000000000 , it can be interpreted as below:
```
************************************************************                                                                                                             
| Main:  |                                                                                                                                                               
+ Raw                    :  0004079f#0020000000000000
+ Sender                 :  vcan0
+ Extent ID Frame        :  00000000001000000011110011111
+ DLC                    :  8
+ Data Frame             :  ['00200000', '00000000']

| Extend ID Frame |
+ Source Device          :  Pi
+ Target Device          :  BroadCast
+ Command Word           :  11
+ CMD or Register ADR    :  READ_DATA_REGS

| Action |
+ CW Means               :  CMD
| Data Frame |
+ Command                :  [('Data Reg Start:', <DataRegTable.CID: ['0000000', 'Channel ID', 'Determined by motor']>), ('Data Reg count:', 32)]                        
************************************************************
```

## Quick VSMD-CAN setup and drive

See in CommonCMD in [VSMD1X6.py](https://github.com/JChrysanthemum/VSMD/blob/master/vsmd/VSMD1X6.py)


## Generate your own CMD

I have sealed most type of command of VSMD in script,you can import them like this:

```
from VSMD import CommonCMD
```

Which contains these sub-function:

* enable_motor(device: str)
    
    ENA  0x01
    
    CAN motor is allowed to move after ENA is ON
    
* disable_motor(device: str)

    OFF  0x02

    Make CAN motor ignore move cmd. Often used for broadcast

* move_motor(device: str, speed: int)

    MOV  0x05

    Move motor with specific speed. This is somehow dangerous

* stop_motor(device: str)

    STP  0x04

    Stop the motor now.

* move_to(device: str, pos: int)

    POS  0x06

    Mode to absolute pos.
    
* move_dis(device: str, dis: int)

    RMV  0x0B
    
    Mode to relative pos.

* read_status_regs(device: str, reg: StatusRegTable, cnt: int)

    READ STATUS REGS  0x1E

    Follow the PDF

* read_data_regs(device: str, reg: DataRegTable, cnt: int)
        
    READ DATA REGS  0x1F
        
    Follow the PDF
    
* write_data_regs(device: str, reg: DataRegTable, data):

  Note that you must use save after write some registers


