| 0,0 → 1,658 |
| #include <stdio.h> |
| #include <string.h> |
| #include <unistd.h> |
| #include "libusmc.h" |
| |
| |
| #define MENU_EXIT 0 |
| #define MENU_ERROR 1 |
| #define MENU_CONTINUE 2 |
| |
| USMC_Devices devices; |
| DWORD cur_dev; |
| |
| char str [105] = { 100 }; |
| |
| // Function that prints information about connected devices to console |
| void print_devices ( USMC_Devices devices ) |
| { |
| DWORD i; |
| |
| for ( i = 0 ; i < devices.NOD ; i++ ) |
| printf ( "Device# %d,\tSerial Number - %.16s,\tVersion - %.4s\n", i + 1, devices.Serial [i], devices.Version [i] ); |
| } |
| |
| // Function that prints information about device state to console |
| void print_state ( USMC_State state ) |
| { |
| printf ( "The state is:\n" ); |
| printf ( "- Current Position in microsteps - %d\n", state.CurPos ); |
| printf ( "- Temperature - %.2f\xf8\x43\n", state.Temp ); |
| printf ( "- Step Divisor - %d\n", state.SDivisor ); |
| printf ( "- Loft state - %s\n", state.Loft?"Indefinite" : "Fixed" ); |
| printf ( "- Power - %s\n", state.Power ? ( state.FullPower ? "Full" : "Half" ) : "Off" ); |
| |
| if ( state.RUN ) |
| printf ( "- Step Motor is Running in %s Direction %s\n", |
| state.CW_CCW ? "CCW" : "CW", ( ( state.SDivisor == 1 ) && state.FullSpeed ) ? "at Full speed" : "" ); |
| else |
| printf ( "- Step Motor is Not Running\n" ); |
| |
| printf ( "- Device %s\n", state.AReset ? "is After Reset" : "Position Already Set" ); |
| printf ( "- Input Synchronization Logical Pin state - %s\n", state.SyncIN ? "TRUE" : "FALSE" ); |
| printf ( "- Output Synchronization Logical Pin state - %s\n", state.SyncOUT ? "TRUE" : "FALSE" ); |
| printf ( "- Rotary Transducer Logical Pin state - %s\n", state.RotTr ? "TRUE" : "FALSE" ); |
| printf ( "- Rotary Transducer Error Flag - %s\n", state.RotTrErr ? "Error" : "Clear" ); |
| printf ( "- Emergency Disable Button - %s\n", state.EmReset ? "Pushed" : "Unpushed" ); |
| printf ( "- Trailer 1 Press state - %s\n", state.Trailer1 ? "Pushed" : "Unpushed" ); |
| printf ( "- Trailer 2 Press state - %s\n", state.Trailer2 ? "Pushed" : "Unpushed" ); |
| |
| if ( state.Voltage == 0.0f ) |
| printf ( "- Input Voltage - Low\n", state.Voltage ); |
| else |
| printf ( "- Input Voltage - %.1fV\n", state.Voltage ); |
| } |
| |
| // Function that scans start parameters |
| void scan_start_params ( int * dest_pos, float * speed, USMC_StartParameters * sp ) |
| { |
| // Defaults |
| *speed = 2000.0f; |
| *dest_pos = 0; |
| sp -> SDivisor = 8; |
| |
| printf ( "Destination position:" ); |
| scanf ( "%d", dest_pos ); |
| printf ( "\nSpeed (in tacts):" ); |
| scanf ( "%f", speed ); |
| printf ( "\nSteps Divisor:" ); |
| scanf ( "%d", &( sp -> SDivisor ) ); |
| getchar (); |
| } |
| |
| // Function that prints information about device start parameters to console |
| void print_start_params ( int dest_pos, float speed, const USMC_StartParameters sp ) |
| { |
| printf ( "Destination position - %d\n", dest_pos ); |
| printf ( "speed - %.2ftacts/s\n", speed ); |
| printf ( "Steps Divisor - %d\n", sp.SDivisor ); |
| |
| if ( sp.SDivisor == 1 ) |
| printf ( "Slow start/stop mode - %s\n", sp.SlStart ? "Enabled" : "Disabled" ); |
| else if ( sp.LoftEn ) { |
| printf ( "Automatic backlash operation - Enabled\n" ); |
| printf ( "Automatic backlash operation direction - %s\n", sp.DefDir ? "CCW" : "CW" ); |
| printf ( "Force automatic backlash operation - %s\n", sp.ForceLoft ? "TRUE" : "FALSE" ); |
| } else { |
| printf ( "Automatic backlash operation - Disabled\n" ); |
| } |
| if ( sp.WSyncIN ) |
| printf ( "Controller will wait for input synchronization signal to start\n" ); |
| else |
| printf ( "Input synchronization signal ignored \n" ); |
| |
| printf ( "Output synchronization counter will %sbe reset\n", sp.SyncOUTR ? "" : "not " ); |
| } |
| |
| // Function that prints information about device parameters to console |
| void print_params ( USMC_Parameters params ) |
| { |
| printf ( "The parameters are:\n" ); |
| printf ( "Full acceleration time - %.0f ms\n", ( double ) params.AccelT ); |
| printf ( "Full deceleration time - %.0f ms\n", ( double ) params.DecelT ); |
| printf ( "Power reduction timeout - %.0f ms\n", ( double ) params.PTimeout ); |
| printf ( "Button speedup timeout 1 - %.0f ms\n", ( double ) params.BTimeout1 ); |
| printf ( "Button speed after timeout 1 - %.2f steps/s\n", ( double ) params.BTO1P ); |
| printf ( "Button speedup timeout 2 - %.0f ms\n", ( double ) params.BTimeout2 ); |
| printf ( "Button speed after timeout 2 - %.2f steps/s\n", ( double ) params.BTO2P ); |
| printf ( "Button speedup timeout 3 - %.0f ms\n", ( double ) params.BTimeout3 ); |
| printf ( "Button speed after timeout 3 - %.2f steps/s\n", ( double ) params.BTO3P ); |
| printf ( "Button speedup timeout 4 - %.0f ms\n", ( double ) params.BTimeout4 ); |
| printf ( "Button speed after timeout 4 - %.2f steps/s\n", ( double ) params.BTO4P ); |
| printf ( "Button reset timeout - %.0f ms\n", (double) params.BTimeoutR ); |
| printf ( "Button reset operation speed - %.2f steps/s\n", ( double ) params.MinP ); |
| printf ( "Backlash operation distance - %d steps\n", ( int ) params.MaxLoft ); |
| printf ( "Revolution distance - %d steps\n", ( int ) params.RTDelta ); |
| printf ( "Minimal revolution distance error - %d steps\n", ( int ) params.RTMinError ); |
| printf ( "Power off temperature - %.2f\xf8\x43\n", ( double ) params.MaxTemp ); |
| printf ( "Duration of the output synchronization pulse - " ); |
| |
| if ( params.SynOUTP == 0 ) |
| printf ( "minimal\n"); |
| else |
| printf ( "%.1f * [Tact Period]\n", params.SynOUTP - 0.5 ); |
| |
| printf ( "speed of the last phase of the backlash operation - " ); |
| |
| if ( params.LoftPeriod == 0.0f ) |
| printf ( "normal\n" ); |
| else |
| printf ( "%.2f steps/s\n", ( double ) params.LoftPeriod ); |
| |
| printf ( "<Angular Encoder Step> Equals <Angular Step Motor Step>/<%.2f>\n", params.EncMult ); |
| } |
| |
| // Function that prints information about device "mode" parameters to console |
| void print_mode ( USMC_Mode mode ) |
| { |
| printf ( "mode parameters:\n" ); |
| printf ( "Buttons - "); |
| |
| if ( mode.PMode ) |
| printf ( "Disabled\n" ); |
| else { |
| printf ( "Enabled\nButton 1 TRUE state - %s\n", mode.Butt1T ? "+3/+5 V" : "0 V(GND)" ); |
| printf ( "Button 2 TRUE state - %s\n", mode.Butt2T ? "+3/+5 V" : "0 V(GND)" ); |
| } |
| |
| printf ( "Current reduction regime - %s\n", mode.PReg ? "Used" : "Not Used" ); |
| |
| if ( mode.ResetD ) |
| printf ( "Power - %s\n", mode.EMReset ? "Emerjency Off" : "Off" ); |
| else |
| printf ( "Power - On\n" ); |
| |
| if ( mode.Tr1En || mode.Tr2En ) |
| printf ( "Trailers are - %s\n", mode.TrSwap ? "Swapped" : "Direct" ); |
| |
| printf ( "Trailer 1 - "); |
| |
| if ( mode.Tr1En ) |
| printf ( "Enabled\nTrailer 1 TRUE state - %s\n", mode.Tr1T ? "+3/+5 V" : "0 V(GND)" ); |
| else |
| printf ( "Disabled\n" ); |
| |
| printf ( "Trailer 2 - " ); |
| |
| if ( mode.Tr2En ) |
| printf ( "Enabled\nTrailer 2 TRUE state - %s\n", mode.Tr2T ? "+3/+5 V" : "0 V(GND)" ); |
| else |
| printf ( "Disabled\n" ); |
| |
| if ( mode.EncoderEn ) { |
| printf ( "Encoder - Enabled\n" ); |
| printf ( "Encoder Position Counter is %s\n", mode.EncoderInv ? "Inverted" : "Direct" ); |
| printf ( "Rotary Transducer and Input Syncronisation are\n" |
| " Disabled Because of Encoder\n" ); |
| } else { |
| printf ( "Encoder - Disabled\n" ); |
| printf ( "Rotary Transducer - " ); |
| |
| if ( mode.RotTeEn ) { |
| printf ( "Enabled\nRotary Transducer TRUE state - %s\n", mode.RotTrT ? "+3/+5 V" : "0 V(GND)" ); |
| printf ( "Rotary Transducer Operation - %s\n", mode.RotTrOp ? "Stop on error" : "Check and ignore error" ); |
| printf ( "Reset Rotary Transducer Check Positions - %s\n", mode.ResetRT ? "Initiated" : "No, why?" ); |
| } else { |
| printf ( "Disabled\n" ); |
| } |
| |
| printf ( "Synchronization input mode:\n" ); |
| |
| if ( mode.SyncINOp ) |
| printf ( "Step motor will move one time to the destination position\n" ); |
| else |
| printf ( "Step motor will move multiple times by [destination position]\n" ); |
| } |
| |
| printf ( "Output Syncronization - " ); |
| |
| if ( mode.SyncOUTEn ) { |
| printf ( "Enabled\nReset Output Synchronization Counter - %s\n", mode.SyncOUTR ? "Initiated" : "No, why?" ); |
| printf ( "Number of steps after which synchronization output sygnal occures - %u\n", mode.SyncCount ); |
| } else { |
| printf ( "Disabled\n" ); |
| } |
| |
| printf ( "Synchronization Output is " ); |
| |
| if ( mode.SyncInvert ) |
| printf ( "INVERTED\n" ); |
| else |
| printf ( "NORMAL\n" ); |
| } |
| |
| void print_enc_state ( USMC_EncoderState enc_state, USMC_Parameters up ) |
| { |
| printf ( "The encoder state is:\n" ); |
| printf ( "- Current Position in microsteps - %.2f\n", enc_state.ECurPos/up.EncMult ); |
| printf ( "- Encoder Position in microsteps - %.2f\n\n", enc_state.EncoderPos/up.EncMult ); |
| printf ( "- Current Position in \"Half of Encoder Step\"s - %d\n", enc_state.ECurPos ); |
| printf ( "- Encoder Position in \"Half of Encoder Step\"s - %d\n", enc_state.EncoderPos ); |
| } |
| |
| // Function that prints last error information |
| void print_error ( void ) |
| { |
| char er [256]; |
| |
| USMC_GetLastErr ( er, 255 ); |
| er [255] = '\0'; |
| printf ( "\n%s", er ); |
| } |
| |
| |
| USMC_State state; |
| USMC_StartParameters start_params; |
| USMC_Parameters params; |
| USMC_Mode mode; |
| USMC_EncoderState enc_state; |
| |
| // Reference to Functions For Every Command (defined at the end of the file) |
| BOOL f1_get_dev_state ( void ); |
| BOOL f2_start ( void ); |
| BOOL f3_stop ( void ); |
| BOOL f4_set_params ( void ); |
| BOOL f5_set_mode ( void ); |
| BOOL f6_set_cur_pos ( void ); |
| BOOL f7_turn_off_and_save_pos ( void ); |
| BOOL fs7_revert_sp_to_0 ( void ); |
| BOOL f8_get_enc_state ( void ); |
| BOOL fp_change_power ( void ); |
| |
| BOOL smpower = FALSE; |
| |
| int menu ( void ) |
| { |
| BOOL err = FALSE; |
| char menu_sel; |
| |
| printf ( "menu :\n" |
| "1 - Get Device state\n" |
| "2 - START\n" |
| "3 - STOP\n" |
| "4 - Set Parameters (can be changed only in c++ code)\n" |
| "5 - Set mode (can be changed only in c++ code)\n" |
| "6 - Set Current Position (can be changed only in c++ code)\n" |
| "7 - Turn Off and Save Current Position to Flash\n" |
| "SHIFT + 7 - Revert Start Position to 0\n" |
| "8 - Get Encoder state\n" |
| "\n" |
| "p - Turn %s Power" |
| "\n" |
| "9 - Select other device\n" |
| "0 - Exit program\n" |
| "Choose:", smpower ? "Off" : "On" ); |
| |
| menu_sel = getchar (); |
| |
| switch ( menu_sel ) |
| { |
| case '1': |
| err = f1_get_dev_state (); |
| break; |
| case '2': |
| err = f2_start (); |
| break; |
| case '3': |
| err = f3_stop (); |
| break; |
| case '4': |
| err = f4_set_params (); |
| break; |
| case '5': |
| err = f5_set_mode (); |
| break; |
| case '6': |
| err = f6_set_cur_pos (); |
| break; |
| case '7': |
| err = f7_turn_off_and_save_pos (); |
| break; |
| case '&': // 'SHIFT 7' on my keyboard |
| err = fs7_revert_sp_to_0 (); |
| break; |
| case '8': |
| err = f8_get_enc_state (); |
| break; |
| case 'p': |
| case 'P': |
| err = fp_change_power (); |
| break; |
| |
| case '9': |
| return MENU_ERROR; |
| case '0': |
| printf ( "\n" ); |
| return MENU_EXIT; |
| default: |
| system ( "clear" ); |
| break; |
| } |
| |
| if ( err ) { |
| print_error (); |
| printf ( "\nPerforming Refressh..." ); |
| getchar (); |
| |
| if ( USMC_Init ( &devices ) ) { |
| print_error (); |
| return MENU_EXIT; |
| } |
| |
| return MENU_ERROR; |
| } |
| |
| return MENU_CONTINUE; |
| } |
| |
| int select_menu ( void ) |
| { |
| int ret; |
| do { |
| system ( "clear" ); |
| cur_dev = -1; |
| print_devices ( devices ); |
| printf ( "\n\t0\tExit\n" ); |
| for ( ret=0;ret<devices.NOD;ret++) printf ( "\t%d\tDevice # %d\n",ret+1,ret+1 ); |
| printf ( "\tx\tReInitialize\n" ); |
| printf ( "\txx\tClose Driver Window and Exit Program\n" ); |
| |
| printf ( "Select:" ); |
| scanf ( "%s", str ); |
| getchar (); |
| |
| if ( strcmp ( str, "x" ) == 0 ) |
| { |
| //// Perform "Refresh" of Driver |
| if ( USMC_Init ( &devices ) ) |
| { |
| print_error (); |
| return MENU_EXIT; |
| } |
| |
| continue; |
| } else if ( strcmp ( str, "xx" ) == 0 ) { |
| //// Close the MicroSMC.exe process |
| if ( USMC_Close () ) |
| { |
| print_error (); |
| return MENU_EXIT; |
| } |
| |
| return MENU_EXIT; |
| } |
| |
| sscanf ( str, "%u", &cur_dev ); |
| |
| if ( cur_dev == 0 ) |
| return MENU_EXIT; |
| } while ( cur_dev > devices.NOD ); |
| |
| system ( "clear" ); |
| |
| cur_dev--; // Decrement cur_dev by 1 ( we have zero-based device list, |
| // but 1-based is user-friendly ) |
| |
| do { |
| ret = menu (); |
| } while ( ret == MENU_CONTINUE ); |
| |
| return ret; |
| } |
| |
| int exit_program ( void ) |
| { |
| printf ( "\nPress any key to exit" ); |
| getchar (); |
| |
| return MENU_EXIT; |
| } |
| |
| int main ( int argc, const char ** argv ) |
| { |
| int res; |
| |
| // change terminal mode to non-buffering |
| system ( "stty -icanon min 1" ); |
| setbuf ( stdin, NULL ); |
| system ( "clear" ); |
| |
| if ( USMC_Init ( &devices ) ) |
| { |
| print_error (); |
| |
| return exit_program (); |
| } |
| |
| while ( select_menu () ); |
| |
| res = exit_program (); |
| //restore terminal mode |
| system ( "stty -icanon" ); |
| |
| return res; |
| } |
| |
| |
| |
| BOOL f1_get_dev_state ( void ) |
| { |
| if ( USMC_GetState ( cur_dev, &state ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| print_state ( state ); |
| printf ( "\nPress any key to continue" ); |
| getchar (); |
| system ( "clear" ); |
| |
| return FALSE; |
| } |
| |
| BOOL f2_start ( void ) |
| { |
| float speed = 2000.0f; |
| int dest_pos = 0; |
| |
| if ( USMC_GetStartParameters ( cur_dev, &start_params ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| scan_start_params ( &dest_pos, &speed, &start_params ); |
| start_params.SlStart = TRUE; |
| |
| if ( USMC_Start ( cur_dev, dest_pos, &speed, &start_params ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| print_start_params ( dest_pos, speed, start_params ); |
| printf ( "\n" ); |
| return FALSE; |
| } |
| |
| BOOL f3_stop ( void ) |
| { |
| if ( USMC_Stop ( cur_dev ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| printf ( "Motor stopped\n\n" ); |
| |
| return FALSE; |
| } |
| |
| BOOL f4_set_params ( void ) |
| { |
| if ( USMC_GetParameters ( cur_dev, ¶ms ) ) |
| return TRUE; |
| |
| // Set anything you want here |
| params.MaxTemp = 70.0f; |
| params.AccelT = 200.0f; |
| params.DecelT = 200.0f; |
| params.BTimeout1 = 5000.0f; |
| params.BTimeout2 = 5000.0f; |
| params.BTimeout3 = 5000.0f; |
| params.BTimeout4 = 5000.0f; |
| params.BTO1P = 625.0f; |
| params.BTO2P = 16.0f; |
| params.BTO3P = 625.0f; |
| params.BTO4P = 16.0f;//500.0f; |
| params.MinP = 500.0f; |
| params.BTimeoutR = 500.0f; |
| params.LoftPeriod = 500.0f; |
| params.RTDelta = 200; |
| params.RTMinError = 15; |
| params.EncMult = 2.5f; |
| params.MaxLoft = 32; |
| params.PTimeout = 100.0f; |
| params.SynOUTP = 1; |
| // |
| |
| if ( USMC_SetParameters ( cur_dev, ¶ms ) ) |
| return TRUE; |
| |
| if ( USMC_SaveParametersToFlash ( cur_dev ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| print_params ( params ); |
| printf ( "\nThese Parameters are Saved to Flash" ); |
| printf ( "\nPress any key to continue" ); |
| getchar (); |
| system ( "clear" ); |
| |
| return FALSE; |
| } |
| |
| BOOL f5_set_mode ( void ) |
| { |
| if ( USMC_GetMode ( cur_dev, &mode ) ) |
| return TRUE; |
| |
| // Set anything you want here |
| mode.SyncInvert = !mode.SyncInvert; |
| mode.EncoderEn = TRUE; |
| mode.RotTrOp = FALSE; |
| mode.ResetRT = TRUE; |
| mode.ResBEnc = TRUE; |
| // Set anything you want here |
| |
| if ( USMC_SetMode ( cur_dev, &mode ) ) |
| return TRUE; |
| |
| |
| system ( "clear" ); |
| print_mode ( mode ); |
| printf ( "\nPress any key to continue" ); |
| getchar (); |
| system ( "clear" ); |
| |
| return FALSE; |
| } |
| |
| BOOL f6_set_cur_pos ( void ) |
| { |
| int newCurPos = 1000; |
| |
| if ( USMC_SetCurrentPosition ( cur_dev, newCurPos ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| printf ( "\nSetCurrentPosition executed with argument %d", newCurPos ); |
| printf ( "\nPress any key to continue" ); |
| getchar (); |
| system ( "clear" ); |
| |
| return FALSE; |
| } |
| |
| BOOL f7_turn_off_and_save_pos ( void ) |
| { |
| // Initialize structures (in case this function runs first) |
| if ( USMC_GetParameters ( cur_dev, ¶ms ) ) |
| return TRUE; |
| if ( USMC_GetMode ( cur_dev, &mode ) ) |
| return TRUE; |
| |
| // Go to Full Step (automaticaly), then Turn Off |
| mode.ResetD = TRUE; |
| |
| if ( USMC_SetMode ( cur_dev, &mode ) ) |
| return TRUE; |
| |
| // Wait until Previous Comand is Done |
| do { |
| usleep ( 50 ); |
| |
| if ( USMC_GetState ( cur_dev, &state ) ) |
| return TRUE; |
| } while ( state.Power == TRUE ); |
| |
| // Remember CurPos in Parameters Only While state.Power - FALSE |
| params.StartPos = state.CurPos; |
| |
| if ( USMC_SetParameters ( cur_dev, ¶ms ) ) |
| return TRUE; |
| |
| // Then of Course You Need to SaveToFlash |
| if ( USMC_SaveParametersToFlash ( cur_dev ) ) |
| return TRUE; |
| |
| // Now You Can Unplug ME |
| system ( "clear" ); |
| printf ( "\nThe Position \"%d\" is Saved to Flash\n", params.StartPos ); |
| printf ( "\nWhen Controller is Powered Up Next Time\n" ); |
| printf ( "\nIt Will Start From This Position\n" ); |
| printf ( "\nPress any key to exit" ); |
| getchar (); |
| system ( "clear" ); |
| |
| return FALSE; |
| } |
| |
| BOOL fs7_revert_sp_to_0 ( void ) |
| { |
| // Initialize structures (in case this function runs first) |
| if ( USMC_GetParameters ( cur_dev, ¶ms ) ) |
| return TRUE; |
| |
| params.StartPos = 0; |
| |
| if ( USMC_SetParameters ( cur_dev, ¶ms ) ) |
| return TRUE; |
| |
| // Then of Course You Need to SaveToFlash |
| if ( USMC_SaveParametersToFlash ( cur_dev ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| printf ( "\nStart Position is Reset to 0\n" ); |
| printf ( "\nPress any key to continue" ); |
| getchar (); |
| |
| return FALSE; |
| } |
| |
| BOOL f8_get_enc_state ( void ) |
| { |
| if ( USMC_GetEncoderState ( cur_dev, &enc_state ) ) |
| return TRUE; |
| if ( USMC_GetParameters ( cur_dev, ¶ms ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| print_enc_state ( enc_state, params ); |
| printf ( "\nPress any key to continue" ); |
| getchar (); |
| system ( "clear" ); |
| |
| return FALSE; |
| } |
| |
| BOOL fp_change_power ( void ) |
| { |
| if ( USMC_GetMode ( cur_dev, &mode ) ) |
| return TRUE; |
| |
| smpower = !smpower; |
| mode.ResetD = !smpower; |
| |
| if ( USMC_SetMode ( cur_dev, &mode ) ) |
| return TRUE; |
| |
| system ( "clear" ); |
| printf ( "Now, Power is %s\n", mode.ResetD ? "Off" : "On" ); |
| |
| return FALSE; |
| } |