aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Modules/Thread/Thread_init.c
blob: 41daa4002a30c5746be1bc952046afc93955dbcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
pre { line-height: 125%; }
td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; }
td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc 
/************************************************************************************************************************
 **************************************************************************************************************************/

#include <DataDef.h>
#include "include.h"

#include "PMR/Hardware/HardwareMotor.pb-c.h"
#include "PMR/Hardware/HardwareDancer.pb-c.h"
#include "PMR/Hardware/HardwareWinder.pb-c.h"
#include "PMR/Hardware/HardwareBreakSensor.pb-c.h"
#include "PMR/Printing/JobSpool.pb-c.h"
#include "PMR/common/MessageContainer.pb-c.h"

#include "thread.h"
MotorDriverConfigStruc  MotorsCfg[NUM_OF_MOTORS]={0};
HardwarePidControl MotorsControl[MAX_THREAD_MOTORS_NUM] = {0};

int32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES] = {0};
int MotorSamplePointer[MAX_THREAD_MOTORS_NUM] = {0};
double NormalizedErrorCoEfficient[MAX_THREAD_MOTORS_NUM] = {0};
int DancerStopActivityLimit[MAX_THREAD_MOTORS_NUM] = {0};
HardwareDancer DancersCfg[MAX_SYSTEM_DANCERS] = {0};

bool BreakSensorenabled;
int32_t BreakSensordebouncetimemilli;

HardwarePidControlType ThreadMotorIdToControlId[MAX_THREAD_MOTORS_NUM] = {HARDWARE_PID_CONTROL_TYPE__MotorFeeder,HARDWARE_PID_CONTROL_TYPE__MotorDryer,HARDWARE_PID_CONTROL_TYPE__MotorPooler,HARDWARE_PID_CONTROL_TYPE__MotorWinder,0};

//********************************************************************************************************************
uint32_t MotorsConfigMessage(HardwareMotor * request)
{
    uint32_t status = PASSED;
    TimerMotors_t Motor_i;
    Motor_i = request->hardwaremotortype;
        MotorsCfg[Motor_i].configword = request->configword;
        MotorsCfg[Motor_i].hardwaremotortype = request->hardwaremotortype;
        MotorsCfg[Motor_i].minfrequency = request->minfrequency;
        MotorsCfg[Motor_i].maxfrequency = request->maxfrequency;
        MotorsCfg[Motor_i].setmicrostep = request->setmicrostep;
        MotorsCfg[Motor_i].microstep = request->microstep;
        MotorsCfg[Motor_i].maxchangeslope = request->maxchangeslope;
        MotorsCfg[Motor_i].highlengthmicrosecond = request->highlengthmicrosecond;
        MotorsCfg[Motor_i].speedmaster = request->speedmaster;
        MotorsCfg[Motor_i].pulseperround = request->pulseperround;
        MotorsCfg[Motor_i].pulleyradius = request->pulleyradius;
        MotorsCfg[Motor_i].configword = request->configword;
        MotorsCfg[Motor_i].directionthreadwize = request->directionthreadwize;
        MotorsCfg[Motor_i].kvalhold = request->kvalhold;
        MotorsCfg[Motor_i].kvalrun = request->kvalrun;
        MotorsCfg[Motor_i].kvalacc = request->kvalacc;
        MotorsCfg[Motor_i].kvaldec = request->kvaldec;
        MotorsCfg[Motor_i].overcurrentthreshold = request->overcurrentthreshold;
        MotorsCfg[Motor_i].stallthreshold = request->stallthreshold;
        MotorsCfg[Motor_i].thermalcompensationfactor = request->thermalcompensationfactor;
        MotorsCfg[Motor_i].lowspeedoptimization = request->lowspeedoptimization;
        MotorsCfg[Motor_i].stslp = request->stslp;
        MotorsCfg[Motor_i].intspd = request->intspd;
        MotorsCfg[Motor_i].fnslpacc = request->fnslpacc;
        MotorsCfg[Motor_i].fnslpdec = request->fnslpdec;
        MotorsCfg[Motor_i].fsspd = request->fsspd;

        status = MotorConfig( Motor_i,  &MotorsCfg[Motor_i]);
//        if (Motor_i == MOTOR_RDRIVING)
//            ThreadInitialTestStub(request);

        return status;
//    }
//    else return Motor_i;

}
uint32_t MotorPidRequestMessage(HardwarePidControl* request)
{
    int Motor_i,i;
    int temp;
    for (i=0;i<MAX_THREAD_MOTORS_NUM;i++)
    {
        if (ThreadMotorIdToControlId[i] == request->hardwarepidcontroltype)
        {
            Motor_i = i;
            break;
        }
    }
    memcpy (&MotorsControl[Motor_i],request,sizeof(HardwarePidControl));
    if (MotorsControl[Motor_i].pvinputfilterfactormode > MAX_CONTROL_SAMPLES)
        MotorsControl[Motor_i].pvinputfilterfactormode = MAX_CONTROL_SAMPLES;
    for (i = 0;i < MotorsControl[Motor_i].pvinputfilterfactormode; i++)
        MotorSamples[Motor_i][i] = 0;  //reset the samples value for control beginning
    NormalizedErrorCoEfficient[Motor_i] = (2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength);
    temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits);
    temp=(10*(temp-1)*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm);
    NormalizedErrorCoEfficient[Motor_i] = NormalizedErrorCoEfficient[Motor_i] / temp;
//    uint32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES];
    temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits);
    temp = (temp*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].maximalmovementmm*2);
    DancerStopActivityLimit[Motor_i] = temp/(2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength);
    return OK;
}
uint32_t DancerConfigMessage(HardwareDancer * request)
{
    uint32_t status = PASSED;
    int Dancer_i;

    Dancer_i = request->hardwaredancertype;
    if (Dancer_i<MAX_SYSTEM_DANCERS )
    {
        memcpy (&DancersCfg[Dancer_i],request,sizeof(HardwareDancer));
        return status;
    }
    else
        return Dancer_i;

}
uint32_t ThreadConfigBreakSensor(void *request)
{
    HardwareBreakSensor  *SensorCfg = (HardwareBreakSensor*)request;
    if (SensorCfg)
    {
        BreakSensorenabled = SensorCfg->enabled;
        BreakSensordebouncetimemilli = SensorCfg->debouncetimemilli;
        return OK;
    }
    return ERROR;
}
uint32_t thread_init(void)
{
    //memset (MotorsCfg,0,sizeof(MotorsCfg));
    //memset (&InternalWinderCfg,0,sizeof(InternalWinderConfigStruc));

    return OK;
}