aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Embedded_SW/Embedded/Modules/Thread/Thread.h
blob: c912bca21d4a6000d57bfdc1b84635188a63580c (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
#ifndef MODULES_THREAD_THREAD_H_
#define MODULES_THREAD_THREAD_H_

#include "PMR/common/MessageContainer.pb-c.h"
#include "PMR/Hardware/HardwareMotor.pb-c.h"
#include "PMR/Hardware/HardwareMotorType.pb-c.h"
#include "PMR/Hardware/HardwareDancer.pb-c.h"
#include "PMR/Hardware/HardwareDancerType.pb-c.h"
#include "PMR/Hardware/HardwareWinder.pb-c.h"
#include "PMR/Hardware/HardwarePidControl.pb-c.h"
#include "PMR/Hardware/HardwareConfiguration.pb-c.h"
#include "PMR/Printing/JobSpool.pb-c.h"
#include "PMR/Printing/JobSpoolType.pb-c.h"

#include "drivers/Motors/Motor.h"
#include "../control/pidalgo.h"

#include "thread_ex.h"

#define NORMAL_COEF_DIVIDER 100
typedef struct
{
    uint32_t startoffsetpulses;
    uint32_t spoolbackingrate;
    uint32_t segmentoffsetpulses;// the spool winding initial length in mm
    uint32_t milimetersperrotation;
    uint32_t SpoolBottomBackingRate;// the angle of the bottom of the spool
    double NumberOfRotationPerPassage;  // how many rotations per spool passage
    double diameter;
}InternalWinderConfigStruc;
typedef struct
{
    bool                m_isEnabled;
    int32_t             m_SetParam;
    float               m_mesuredParam;
    float               m_preError;
    float               m_integral;
    float               m_calculatedError;
    bool                m_isReady;
    uint32_t            m_ingnoreValue;
    PID_Config_Params   m_params;
}MotorControlConfig_t;


#define MAX_THREAD_FEED_MOTORS (WINDER_MOTOR+1)
#define MAX_SYSTEM_DANCERS (HARDWARE_DANCER_TYPE__RightDancer+1)

extern TimerMotors_t ThreadMotorIdToMotorId[MAX_THREAD_MOTORS_NUM];
extern HardwareDancerType ThreadMotorIdToDancerId[MAX_THREAD_MOTORS_NUM];
extern HardwarePidControlType ThreadMotorIdToControlId[MAX_THREAD_MOTORS_NUM];

extern bool BreakSensorenabled;
extern int32_t BreakSensordebouncetimemilli;

extern bool SampleWinding;


//extern MotorDriverConfigStruc                MotorsCfg[NUM_OF_MOTORS];
extern HardwarePidControl           MotorsControl[MAX_THREAD_MOTORS_NUM];
//extern InternalWinderConfigStruc    InternalWinderCfg;
extern HardwareDancer               DancersCfg[MAX_SYSTEM_DANCERS];
extern double CurrentControlledSpeed[MAX_THREAD_MOTORS_NUM];
extern double OriginalMotorSpd_2PPS[MAX_THREAD_MOTORS_NUM];

#define MAX_CONTROL_SAMPLES 10
extern int32_t MotorSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES];
extern int MotorSamplePointer[MAX_THREAD_MOTORS_NUM];
extern double NormalizedErrorCoEfficient[MAX_THREAD_MOTORS_NUM];
extern int DancerStopActivityLimit[MAX_THREAD_MOTORS_NUM];
extern    MotorControlConfig_t MotorControlConfig[MAX_THREAD_MOTORS_NUM];
extern double MotorSpeedSamples[MAX_THREAD_MOTORS_NUM][MAX_CONTROL_SAMPLES];
extern int MotorSpeedSamplePointer[MAX_THREAD_MOTORS_NUM];


uint32_t InternalWinderConfigMessage(HardwareWinder* request);
uint32_t MotorsConfigMessage( HardwareConfiguration* HW_request);
uint32_t InternalWindingConfigMessage(JobSpool* request);
uint32_t MotorPidRequestMessage(HardwarePidControl* request);
void     SetKeepWindingCone(bool value);
void SetWinderBackToBaseTime(uint32_t value);

uint32_t DancerConfigMessage(HardwareDancer * request);
uint32_t Control_Delta_Position_Pass(uint32_t Current_Read,uint32_t Previous_Read);

void SetOriginMotorSpeed(float process_speed);

uint32_t ThreadPrepare_Tension (int DancerId, double tension);


#endif //MODULES_THREAD_THREAD_H_
>UserGuid { get; set; } } public class PasswordReset { public String ID { get; set; } public String UserGuid { get; set; } public String FullName { get; set; } } public static List<PasswordReset> PendingPasswordResets { get; set; } static FSEController() { PendingPasswordResets = new List<PasswordReset>(); } [HttpPost] public LoginResponse Login(LoginRequest request) { User user = null; DataSource dataSource = null; IHashGenerator hash = new BasicHashGenerator(); Version client_version; if (!Version.TryParse(request.Version, out client_version)) { client_version = new Version("1.0.0.0"); } var password = hash.Encrypt(request.Password); using (var db = ObservablesContextHelper.CreateContext()) { user = new UserBuilder(db).Set(x => x.Email.ToLower() == request.Email.ToLower() && x.Password == password).WithRolesAndPermissions().WithDeleted().Build(); if (user == null) { throw new AuthenticationException("Invalid email or password."); } if (user.Deleted) { throw new AuthenticationException("Your account has been disabled. Please contact your administrator."); } user.LastLogin = DateTime.UtcNow; db.SaveChanges(); } SQLServerManager sqlServer = new SQLServerManager(); var accessToken = sqlServer.GetAccessToken(); dataSource = new DataSource() { Address = MachineServiceConfig.DB_ADDRESS, Catalog = MachineServiceConfig.DB_CATALOG, Type = DataSourceType.AccessToken, IntegratedSecurity = false, AccessToken = accessToken.AccessToken, AccessTokenExpiration = accessToken.ExpiresOn.UtcDateTime }; //Return data source return new LoginResponse() { DataSource = dataSource, AccessToken = WebToken<TokenObject>.CreateNew(MachineServiceConfig.JWT_TOKEN_SECRET, new TokenObject() { UserGuid = user.Guid, }, DateTime.UtcNow.AddDays(1)).AccessToken, PasswordChangeRequired = user.PasswordChangeRequired }; } [HttpPost] [JwtTokenFilter] public BugReportingInfoResponse GetBugReportInfo(BugReportingInfoRequest request) { return new BugReportingInfoResponse() { CollectionUrl = MachineServiceConfig.TFS_COLLECTION_URL, PersonalToken = MachineServiceConfig.TFS_PERSONAL_TOKEN, UserEmail = MachineServiceConfig.FSE_TFS_USER_EMAIL }; } [HttpPost] [JwtTokenFilter] public DownloadTangoVersionResponse DownloadTangoVersion(DownloadTangoVersionRequest request) { DownloadTangoVersionResponse response = new DownloadTangoVersionResponse(); using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { var tangoVersion = db.TangoVersions.SingleOrDefault(x => x.Guid == request.TangoVersionGuid); if (tangoVersion == null) { throw new ArgumentException("Could not locate the specified Tango version."); } response.Version = tangoVersion.Version; var manager = new BlobStorageManager(); var container = manager.GetContainer(MachineServiceConfig.TANGO_VERSIONS_CONTAINER); var blob = container.GetBlockBlobReference(tangoVersion.BlobName); response.BlobAddress = blob.GenerateReadSignature(TimeSpan.FromMinutes(60)); if (!String.IsNullOrWhiteSpace(MachineServiceConfig.CDN_ENDPOINT)) { response.CdnAddress = MachineServiceConfig.CDN_ENDPOINT + blob.Uri.AbsolutePath; } DbCredentials credentials = new DbCredentials(); using (SmoManager smo = new SmoManager()) { credentials = smo.CreateRandomLoginAndUser(); Task.Delay(TimeSpan.FromMinutes(PPCController.SQL_TEMP_CREDENTIALS_EXP_MINUTS)).ContinueWith((x) => { using (SmoManager m = new SmoManager()) { m.DeleteLoginAndUser(credentials.UserName); } }); } response.DataSource = new DataSource() { Address = MachineServiceConfig.DB_ADDRESS, Catalog = MachineServiceConfig.DB_CATALOG, UserName = credentials.UserName, Password = credentials.Password, IntegratedSecurity = false, Type = DataSourceType.SQLServer, }; } return response; } [HttpPost] [JwtTokenFilter] public CheckForUpdatesResponse CheckForUpdates(CheckForUpdatesRequest request) { CheckForUpdatesResponse response = new CheckForUpdatesResponse(); using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { var versions = db.FseVersions.ToList(); FseVersion latestVersion = null; latestVersion = versions.OrderByDescending(x => Version.Parse(x.Version)).FirstOrDefault(); Version currentVersion = Version.Parse(request.Version); String comments = String.Join(Environment.NewLine, versions.OrderBy(x => Version.Parse(x.Version)).Where(x => Version.Parse(x.Version) > currentVersion).Select(x => x.Comments)); if (latestVersion != null && Version.Parse(latestVersion.Version) != currentVersion) { var manager = new BlobStorageManager(); var container = manager.GetContainer(MachineServiceConfig.FSE_VERSIONS_CONTAINER); //var blob = container.GetBlockBlobReference(latestVersion.BlobName); var installerBlob = container.GetBlockBlobReference(latestVersion.InstallerBlobName); //response.BlobAddress = blob.GenerateReadSignature(TimeSpan.FromMinutes(60)); if (!String.IsNullOrWhiteSpace(MachineServiceConfig.CDN_ENDPOINT)) { //response.CdnAddress = MachineServiceConfig.CDN_ENDPOINT + blob.Uri.AbsolutePath; response.InstallerCdnAddress = MachineServiceConfig.CDN_ENDPOINT + installerBlob.Uri.AbsolutePath; } response.IsUpdateAvailable = true; response.Version = latestVersion.Version; response.Comments = latestVersion.Comments; } } return response; } [HttpPost] [JwtTokenFilter] public RefreshTokenResponse RefreshToken(RefreshTokenRequest request) { SQLServerManager sqlServer = new SQLServerManager(); var accessToken = sqlServer.GetAccessToken(); return new RefreshTokenResponse() { AccessToken = accessToken.AccessToken, Expiration = accessToken.ExpiresOn.UtcDateTime, }; } [HttpPost] [JwtTokenFilter] public UserInvitationEmailResponse SendUserInvitationEmail(UserInvitationEmailRequest request) { User user; using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { user = db.Users.Include(x => x.Contact).SingleOrDefault(x => x.Guid == request.UserGuid); if (user == null) { throw new InvalidOperationException("User not found."); } } var client = new SendGridClient(MachineServiceConfig.SEND_GRID_API_KEY); SendGridMessage msg = new SendGridMessage(); msg.SetFrom("info@twine-s.com", "Twine Solutions LTD"); msg.AddTo(user.Email); msg.Subject = "Welcome To Tango FSE"; msg.SetTemplateId("d-2af42ed0ea3c44b3abaa61016223555a"); var dynamicTemplateData = new { DownloadUrl = $"{request.MachineServiceAddress}/fse", FullName = user.Contact.FirstName, Password = request.Password, }; msg.SetTemplateData(dynamicTemplateData); var result = client.SendEmailAsync(msg).GetAwaiter().GetResult(); if (result.StatusCode != HttpStatusCode.Accepted) { throw new HttpException(result.StatusCode.ToString()); } return new UserInvitationEmailResponse(); } [HttpPost] public ForgotPasswordResponse SendForgotPasswordEmail(ForgotPasswordRequest request) { User user; using (ObservablesContext db = ObservablesContextHelper.CreateContext()) { user = db.Users.Include(x => x.Contact).SingleOrDefault(x => x.Email.ToLower() == request.Email.ToLower()); if (user == null) { throw new InvalidOperationException("User not found."); } } String resetId = Guid.NewGuid().ToString(); var client = new SendGridClient(MachineServiceConfig.SEND_GRID_API_KEY); SendGridMessage msg = new SendGridMessage(); msg.SetFrom("info@twine-s.com", "Twine Solutions LTD"); msg.AddTo(request.Email); msg.Subject = "Tango FSE Password Reset"; msg.SetTemplateId("d-18065487dae4456b8684d4b47a91e4a6"); var dynamicTemplateData = new { ResetPasswordUrl = $"{request.MachineServiceAddress}/FSEAccount/ResetPassword?id={resetId}", FullName = user.Contact.FirstName, }; msg.SetTemplateData(dynamicTemplateData); var result = client.SendEmailAsync(msg).GetAwaiter().GetResult(); if (result.StatusCode != HttpStatusCode.Accepted) { throw new HttpException(result.StatusCode.ToString()); } PendingPasswordResets.Add(new PasswordReset() { ID = resetId, UserGuid = user.Guid, FullName = user.Contact.FirstName, }); return new ForgotPasswordResponse(); } } }