AYAB Arduino Firmware 0.95
The goal of the AYAB project is to provide an alternative way to control the famous Brother KH-9xx range of knitting machines using a computer
knitter.h
Go to the documentation of this file.
1
24#ifndef KNITTER_H_
25#define KNITTER_H_
26
27#include "beeper.h"
28#include "com.h"
29#include "encoders.h"
30#include "solenoids.h"
31#include "tester.h"
32
34public:
35 virtual ~KnitterInterface() = default;
36
37 // any methods that need to be mocked should go here
38 virtual void init() = 0;
39 virtual void setUpInterrupt() = 0;
40 virtual void isr() = 0;
41 virtual Err_t startKnitting(uint8_t startNeedle,
42 uint8_t stopNeedle, uint8_t *pattern_start,
43 bool continuousReportingEnabled) = 0;
44 virtual Err_t initMachine(Machine_t machine) = 0;
45 virtual void encodePosition() = 0;
46 virtual bool isReady() = 0;
47 virtual void knit() = 0;
48 virtual void indState(Err_t error = ErrorCode::success) = 0;
49 virtual uint8_t getStartOffset(const Direction_t direction) = 0;
50 virtual Machine_t getMachineType() = 0;
51 virtual bool setNextLine(uint8_t lineNumber) = 0;
52 virtual void setLastLine() = 0;
53 virtual void setMachineType(Machine_t) = 0;
54};
55
56// Singleton container class for static methods.
57// Dependency injection is enabled using a pointer
58// to a global instance of either `Knitter` or `KnitterMock`
59// both of which classes implement the pure virtual methods
60// of the `KnitterInterface` class.
61
62class GlobalKnitter final {
63private:
64 // singleton class so private constructor is appropriate
65 GlobalKnitter() = default;
66
67public:
68 // pointer to global instance whose methods are implemented
69 static KnitterInterface *m_instance;
70
71 static void init();
72 static void setUpInterrupt();
73#ifndef AYAB_TESTS
74 static void isr();
75#endif
76 static Err_t startKnitting(uint8_t startNeedle,
77 uint8_t stopNeedle, uint8_t *pattern_start,
78 bool continuousReportingEnabled);
79 static Err_t initMachine(Machine_t machine);
80 static void encodePosition();
81 static bool isReady();
82 static void knit();
83 static void indState(Err_t error = ErrorCode::success);
84 static uint8_t getStartOffset(const Direction_t direction);
85 static Machine_t getMachineType();
86 static bool setNextLine(uint8_t lineNumber);
87 static void setLastLine();
88 static void setMachineType(Machine_t);
89};
90
91class Knitter : public KnitterInterface {
92public:
93 void init() final;
94 void setUpInterrupt() final;
95 void isr() final;
96 Err_t startKnitting(uint8_t startNeedle,
97 uint8_t stopNeedle, uint8_t *pattern_start,
98 bool continuousReportingEnabled) final;
99 Err_t initMachine(Machine_t machine) final;
100 void encodePosition() final;
101 bool isReady() final;
102 void knit() final;
103 void indState(Err_t error = ErrorCode::success) final;
104 uint8_t getStartOffset(const Direction_t direction) final;
105 Machine_t getMachineType() final;
106 bool setNextLine(uint8_t lineNumber) final;
107 void setLastLine() final;
108 void setMachineType(Machine_t) final;
109
110private:
111 void reqLine(uint8_t lineNumber);
113 void stopKnitting() const;
114
115 // job parameters
116 Machine_t m_machineType;
117 uint8_t m_startNeedle;
118 uint8_t m_stopNeedle;
119 uint8_t *m_lineBuffer;
120 bool m_continuousReportingEnabled;
121
122 // current machine state
123 uint8_t m_position;
124 Direction_t m_direction;
125 Direction_t m_hallActive;
126 BeltShift_t m_beltShift;
127 Carriage_t m_carriage;
128
129 bool m_lineRequested;
130 uint8_t m_currentLineNumber;
131 bool m_lastLineFlag;
132
133 uint8_t m_sOldPosition;
134 bool m_firstRun;
135 bool m_workedOnLine;
136 Direction_t m_lastHall;
137#ifdef DBG_NOMACHINE
138 bool m_prevState;
139#endif
140
141 // resulting needle data
142 uint8_t m_solenoidToSet;
143 uint8_t m_pixelToSet;
144
145#if AYAB_TESTS
146 // Note: ideally tests would only rely on the public interface.
147 FRIEND_TEST(KnitterTest, test_getStartOffset);
148 FRIEND_TEST(KnitterTest, test_knit_lastLine_and_no_req);
149#endif
150};
151
152#endif // KNITTER_H_
Definition knitter.h:62
Definition knitter.h:91
void stopKnitting() const
Finish knitting procedure.
Definition knitter.cpp:471
bool setNextLine(uint8_t lineNumber) final
Set line number of next row to be knitted.
Definition knitter.cpp:345
void setUpInterrupt() final
Initialize interrupt service routine for Knitter object.
Definition knitter.cpp:90
bool calculatePixelAndSolenoid()
Calculate the solenoid and pixel to be set.
Definition knitter.cpp:391
void init() final
Initialize Knitter object.
Definition knitter.cpp:48
Err_t startKnitting(uint8_t startNeedle, uint8_t stopNeedle, uint8_t *pattern_start, bool continuousReportingEnabled) final
Enter OpState::knit machine state.
Definition knitter.cpp:149
void isr() final
Interrupt service routine.
Definition knitter.cpp:108
void knit() final
Function that is repeatedly called during state OpState::knit
Definition knitter.cpp:242
void indState(Err_t error=ErrorCode::success) final
Send indState message.
Definition knitter.cpp:315
void setLastLine() final
Get value of last line flag.
Definition knitter.cpp:364
void setMachineType(Machine_t) final
Set machine type.
Definition knitter.cpp:372
Machine_t getMachineType() final
Get knitting machine type.
Definition knitter.cpp:323
void reqLine(uint8_t lineNumber)
Send reqLine message.
Definition knitter.cpp:382
uint8_t getStartOffset(const Direction_t direction) final
Get start offset.
Definition knitter.cpp:331
bool isReady() final
Assess whether the Finite State Machine is ready to move from state OpState::init to OpState::ready.
Definition knitter.cpp:201
Err_t initMachine(Machine_t machine) final
Initialize machine type.
Definition knitter.cpp:123
void encodePosition() final
Record current encoder position.
Definition knitter.cpp:187
Definition knitter.h:33
Definition test_knitter.cpp:51