#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
;
}