aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/PPC/Tango.PPC.UI/ViewModels/LoadingViewVM.cs
blob: 281e549585d347f09b59e86d4a8d7e22ebceba1d (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
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Tango.BL;
using Tango.Core;
using Tango.Core.DI;
using Tango.Core.Helpers;
using Tango.PPC.Common;
using Tango.PPC.Common.Application;
using Tango.PPC.Common.Authentication;
using Tango.PPC.Common.MachineSetup;
using Tango.PPC.Common.Modules;
using Tango.PPC.Common.Navigation;
using Tango.PPC.Common.Notifications;
using Tango.PPC.Common.Notifications.NotificationItems;
using Tango.PPC.Jobs;
using Tango.SharedUI;
using System.Data.Entity;

namespace Tango.PPC.UI.ViewModels
{
    /// <summary>
    /// Represents the PPC loading splash screen view model.
    /// </summary>
    /// <seealso cref="Tango.PPC.Common.PPCViewModel" />
    public class LoadingViewVM : PPCViewModel
    {
        /// <summary>
        /// Gets or sets the module loader.
        /// </summary>
        [TangoInject]
        public IPPCModuleLoader ModuleLoader { get; set; }

        private bool _isLoading;
        /// <summary>
        /// Gets or sets a value indicating whether this instance is loading.
        /// </summary>
        public bool IsLoading
        {
            get { return _isLoading; }
            set { _isLoading = value; RaisePropertyChangedAuto(); }
        }

        /// <summary>
        /// Initializes a new instance of the <see cref="LoadingViewVM"/> class.
        /// </summary>
        public LoadingViewVM(IPPCApplicationManager applicationManager)
        {
            if (!DesignMode)
            {
                Task.Delay(1000).ContinueWith((x) => { IsLoading = true; });
            }

            applicationManager.ApplicationInitializationError += ApplicationManager_ApplicationInitializationError;
        }

        private void ApplicationManager_ApplicationInitializationError(object sender, Exception ex)
        {
            InvokeUI(() =>
            {
                NavigationManager.NavigateWithObject<Exception>(NavigationView.LoadingErrorView, ex);
                IsLoading = false;
            });
        }

        /// <summary>
        /// Called when the application has been started.
        /// </summary>
        public async override void OnApplicationStarted()
        {
            using (ObservablesContext db = ObservablesContext.CreateDefault())
            {
                var machine = await db.Machines.FirstAsync();

                if (db.Users.Count() == 1 || machine.AutoLogin)
                {
                    var user = await db.Users.FirstAsync();
                    LogManager.Log($"Application started. Single user/Auto login detected ({user.Email}). Skipping LoginView...");
                    await AuthenticationProvider.Login(user.Email, user.Password, false);
                    IsLoading = false;
                }
                else
                {
                    LogManager.Log("Application started. Navigating to LoginView...");
                    await NavigationManager.NavigateTo(NavigationView.LoginView);
                    IsLoading = false;
                }
            }
        }
    }
}
(EVENT_TYPE__MACHINE_STATE_HW_CONFIG_FAILED,OFF); for (MotorId = 0; MotorId < HWrequest->n_motors ; MotorId++) { request = HWrequest->motors[MotorId]; if (request == NULL) return ERROR; 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; if(MotorDriverResponse[Motor_i].DriverType == CombinrdMotDriver) { MotorsCfg[Motor_i].directionthreadwize = request->directionthreadwize ^ 1;//PowerSTEP01 } else { MotorsCfg[Motor_i].directionthreadwize = request->directionthreadwize;//L6470 + L6472 } 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; MotorsCfg[Motor_i].gatecfg1 = request->gatecfg1; MotorsCfg[Motor_i].gatecfg2 = request->gatecfg2; MotorsCfg[Motor_i].tvalhold = request->tvalhold; MotorsCfg[Motor_i].tvalrun = request->tvalrun ; MotorsCfg[Motor_i].tvalacc = request->tvalacc ; MotorsCfg[Motor_i].tvaldec = request->tvaldec ; MotorsCfg[Motor_i].tfast = request->tfast ; MotorsCfg[Motor_i].tonmin = request->tonmin ; MotorsCfg[Motor_i].toffmin = request->toffmin ; status = MotorConfig( Motor_i, &MotorsCfg[Motor_i]); // if (Motor_i == MOTOR_RDRIVING) // ThreadInitialTestStub(request); } return status; } 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; #ifdef TEST_LONGER_PID_THREAD MotorsControl[Motor_i].pvinputfilterfactormode = 10; //test longer control #endif for (i = 0;i < (int)MotorsControl[Motor_i].pvinputfilterfactormode; i++) { MotorSamples[Motor_i][i] = 0; //reset the samples value for control beginning MotorSpeedSamples[Motor_i][i] = 0; } NormalizedErrorCoEfficient[Motor_i] = (2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength); temp = 1<<(DancersCfg[ThreadMotorIdToDancerId[Motor_i]].resolutionbits); temp=(NORMAL_COEF_DIVIDER*(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*3/2); DancerStopActivityLimit[Motor_i] = temp/(2*PI*DancersCfg[ThreadMotorIdToDancerId[Motor_i]].armlength); return OK; } char DancerConfigPath[50] = "0://SysInfo//DancCfg.cfg"; uint32_t StoreDancerConfigMessage() { FRESULT Fresult = FR_OK; HardwareConfiguration DancerConfig; HardwareDancer Dancers[MAX_SYSTEM_DANCERS]; uint8_t* response_buffer; size_t response_size = 0; int Dancer_i; hardware_configuration__init(&DancerConfig); DancerConfig.dancers = (HardwareDancer**)my_malloc(sizeof(HardwareDancer*)*MAX_SYSTEM_DANCERS); for (Dancer_i = 0; Dancer_i < MAX_SYSTEM_DANCERS; Dancer_i++) { hardware_dancer__init(&Dancers[Dancer_i]); DancerConfig.dancers[Dancer_i] = &Dancers[Dancer_i]; Dancers[Dancer_i].has_zeropoint = true; Dancers[Dancer_i].hardwaredancertype = Dancer_i; Dancers[Dancer_i].has_hardwaredancertype = true; DancerConfig.dancers[Dancer_i]->zeropoint=Control_Read_Dancer_Position(Dancer_i,0,0); DancerConfig.n_dancers++; DancersCfg[Dancer_i].zeropoint = DancerConfig.dancers[Dancer_i]->zeropoint; } MCU_E2PromProgram(EEPROM_STORAGE_DANCER_0,DancersCfg[0].zeropoint); MCU_E2PromProgram(EEPROM_STORAGE_DANCER_1,DancersCfg[1].zeropoint); MCU_E2PromProgram(EEPROM_STORAGE_DANCER_2,DancersCfg[2].zeropoint); Report("Store eeprom 0",__FILE__,DancersCfg[0].zeropoint,(int)DancersCfg[1].zeropoint,RpWarning,(int)DancersCfg[2].zeropoint,0); response_buffer = my_malloc(hardware_configuration__get_packed_size(&DancerConfig)); if (response_buffer) { response_size = hardware_configuration__pack(&DancerConfig, response_buffer); } Fresult = FileWrite(response_buffer,response_size,DancerConfigPath,BIOS_WAIT_FOREVER); EraseFlashSection(DANCERS_MAP_IN_FLASH,1024); for (Dancer_i = 0; Dancer_i < MAX_SYSTEM_DANCERS; Dancer_i++) { ReadAppAndProgram(DANCERS_MAP_IN_FLASH, sizeof(Dancers), Dancers); } my_free(response_buffer); return Fresult; } uint32_t LoadDancerConfigMessage() { void* buffer = NULL; uint32_t Bytes = 0; FRESULT Fresult = FR_OK; HardwareConfiguration *DancerConfig; int Dancer_i; HardwareDancer DancersCfg1[MAX_SYSTEM_DANCERS] = {0}; HardwareDancer DancersCfg2[MAX_SYSTEM_DANCERS] = {0}; memcpy(DancersCfg1,(void *)DANCERS_MAP_IN_FLASH,sizeof(DancersCfg1)); Fresult = FileRead(DancerConfigPath, &Bytes, &buffer); if (Fresult == FR_OK) { DancerConfig = hardware_configuration__unpack(NULL, Bytes, buffer); for (Dancer_i = 0; Dancer_i < DancerConfig->n_dancers ; Dancer_i++) { DancersCfg2[Dancer_i].zeropoint = DancerConfig->dancers[Dancer_i]->zeropoint; } hardware_configuration__free_unpacked(DancerConfig,NULL); free (buffer); } MCU_E2PromRead(EEPROM_STORAGE_DANCER_0,&DancersCfg[0].zeropoint); MCU_E2PromRead(EEPROM_STORAGE_DANCER_1,&DancersCfg[1].zeropoint); MCU_E2PromRead(EEPROM_STORAGE_DANCER_2,&DancersCfg[2].zeropoint); Report("Dancer 0 Store data flash, internal flash, eeprom ",__FILE__,DancersCfg[0].zeropoint,(int)DancersCfg1[0].zeropoint,RpWarning,(int)DancersCfg2[0].zeropoint,0); Report("Dancer 1 Store data flash, internal flash, eeprom ",__FILE__,DancersCfg[1].zeropoint,(int)DancersCfg1[1].zeropoint,RpWarning,(int)DancersCfg2[1].zeropoint,0); Report("Dancer 2 Store data flash, internal flash, eeprom ",__FILE__,DancersCfg[2].zeropoint,(int)DancersCfg1[2].zeropoint,RpWarning,(int)DancersCfg2[2].zeropoint,0); return Fresult; } 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; if (SensorCfg->debouncetimemilli) { BreakSensordebouncetimemilli = SensorCfg->debouncetimemilli; } return OK; } return ERROR; } uint32_t thread_init(void) { //memset (MotorsCfg,0,sizeof(MotorsCfg)); //memset (&InternalWinderCfg,0,sizeof(InternalWinderConfigStruc)); return OK; } void ThreadSetBreakSensorLimit(int limit) { if (limit) BreakSensordebouncetimemilli = limit; }