Overview
MakerManager is an open-sourced, free desktop application created specifically for Users and Managers of MakerSpaces to manage 3-D printers and 3-D prints. It aims to help alleviate the hassle and stress related to sharing limited number of 3-D printers by providing an convenient way of organizing Prints, and optimising the usage of Printers. The app is driven mostly by Command Line Interface (CLI), and therefore optimised for makers who are more comfortable with typing.
MakerManager is based on AddressBook-Level 4, an application written by educators from the National Universtiy of Singapore to teach students the fundamentals of Software Engineering and Object Oriented Programming.
In summary, the MakerManager provides:
-
an overview of 3-D printers and PrintJobs within a MakerSpace
-
functionality to manage and monitor the progress of Prints in real-time
-
separate administrative privileges for Managers and normal Users through an Administrator login system.
-
automatic optimised allocation of prints to Machines for efficient use of the MakerSpace
To find out more about the Team behind MakerManager, please visit the About Us section!
Summary of contributions
-
Major enhancement: Reworked GUI display of the App #83
-
What it does: Displays a holistic view the current state of the MakerSpace, including highlighting the most recently modified Machines, dynamically displaying the progress of each print, as well as dynamically updating when there are changes to Jobs or Machines.
-
Justification: This feature is essential to the software, allowing MakerSpace users and managers to have a easily accessed overview of the MakerSpace that\ changes dynamically to reflect the status of Prints.
-
-
Major enhancement: added the ability to edit a Machine #47
-
What it does: Allows a user to edit the data fields of a Machine.
-
Justification: This feature is important because it allows Users to make changes to a Machine without affecting its Jobs, allowing the app to accommodate changes in the equipment in the makerspace.
-
-
Major enhancement: added commands for managing prints #151
-
What it does: allows users to manage prints in general, including moving, swapping, and shifting prints.
-
Justification: This feature is essential to the software, allowing MakerSpace users and managers to dynamically re-arrange and re-prioritise Jobs.
-
-
Minor enhancement: Non-Trivial reworking Model from storing Jobs and Machines in separate lists to storing Jobs within a List in each Machine. #126
-
Minor enhancement: Encapsulation of the LoggedIn state into the AdminSession object. #82
-
Minor enhancement: Implementation of a Timestamp object to handle time related operations. #83
-
Minor enhancement: Implemented automatic sorting of Jobs based on Status #151
-
Minor enhancement: Bug reports and fixes
-
Code contributed: Code Dashboard by Reposense
-
Other contributions:
-
Project management:
-
Managed releases
v1.1
-v1.2
andv1.4
(3 releases) on GitHub
-
-
Enhancements to existing features:
-
Documentation:
-
Tools:
-
Contributions to the User Guide
Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users. |
Moving, Shifting and Swapping Jobs
Example: manageJob gears restart
-
Delete a Print (Admin only)
Deletes an existing print in the queue.
Outcome: You will no longer see the specified print in the UI.Format: <manageJob> PRINT_NAME delete
Example: manageJob gears delete
-
Move a Print (Admin only)
Moves an existing print that is notONGOING
to another machine. This command inserts the print at the bottom of the target Machine’s queue
Outcome: Print is removed from its current Machine and added to the bottom of the queue of the target Machine.Prints are always displayed sorted in order of ONGOING
, followed byQUEUED
, thenrequestDeletion
orCANCELLED
orFINISHED
.Format: <manageJob> PRINT_NAME move MACHINE_NAME
Example: manageJob gears move ultimaker
-
Shifting a Print (Admin only)
Shifts an existing print that is notONGOING
up or down in it’s queue.
Valid shift options are:-
up
-
down
Prints are always displayed sorted in order of ONGOING
, followed byQUEUED
, thenrequestDeletion
orCANCELLED
orFINISHED
.Format: <manageJob> PRINT_NAME shift SHIFT_OPTION
Example: manageJob chassis shift up
-
Finding and Listing Jobs
-
Finding Prints: Finds Jobs based on given keywords. You have to give at least 1 argument.
Outcome: You will see only matching Jobs shown in the UI.After the filtered job list is displayed, use the listJobs
command to return to the main menu.
Format: findJob [JOB_NAME_1] [JOB_NAME_2]...
Example: findJob gears chassis cup
-
Listing Prints
Lists all prints.
Outcome: All Prints will be visible in the UI.Format: listJobs
Example: listJobs
Undo, Redo and History
-
Undoing and Redoing Commands
The Maker Manager is remembers the sequence of commands entered, and provides the option for users to undo or redo actions should the need arises.The Commands help
history
findJob
findMachine
listJobs
andlistMachines
do not count as commands for the purposes ofundo
andredo
, and therefore trying to undo or redo these commands will instead undo or redo the most recent command that does not belong to the above list!-
Undo: This command reverts the state of Maker Manager to a state before the most recent successful command.
Logout
commands cannot be undone!Format: undo
-
Redo: This command reverts the state of Maker Manager to a state before the most recent successful undo command.
Login
commands cannot be redone!Format: redo
-
History: This command displays a list of commands entered by the user.
Format: history
-
Contributions to the Developer Guide
Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project. |
Managing Prints
This section describes how MakerManager manages the Jobs or Prints within the makerspace. More specifically, this section will detail the implementation of the manageJob command and its various sub-features.
The main command to manage and manipulate the Jobs in the makerManager
is manageJob
which has the following subcommands:
-
start
- sets the status of a job to "ONGOING" -
restart
- sets the status of a job to "ONGOING", functionally the same as start, but used for restarting cancelled Jobs. -
cancel
- sets the status of a job to "CANCELLED" -
remove
- removes the Job from the Maker Manager -
swap
- Swaps the position of two Jobs -
move
- Moves a Job to another Machine -
shift
- Shift a Job’s order within a machine
The syntax for the commands are implemented in the following manner:
manageJob <Jobname> subcommand <operand2>
The subcommands start
, restart
and cancel
do not make use of <operand2>, whereas the subcommands
swap
move
and shift
require
require <operand2> to specify target Job for swap
, Machine for move
, and up/down for shift
.
We have nested these commands as subcommands of manageJob
to centralise the management of Jobs for users, therefore making it
easier for users to manipulate Jobs.
Current Implementation
Our MakerManager keeps a record of all Jobs or Prints in a makerspace distributed across many machines.
Within each Machine
, Jobs are stored within a uniqueJobsList
. The Machines
are in turn stored in a
UniqueMachineList
in the VersionedAddressBook
. The manipulation of the order and the content of the is facilitated by the ModelManager
, which exposes the methods
implemented by the VersionedAddressBook
.
The diagram below shows the Jobs related section of the Model.
There are three main types of methods in VersionedAddressBook
that concern
the manipulation of Jobs:
-
Lookup Methods that return a handle to a Job or Machine:
-
findJob()
-
findMachine()
-
These Methods are used to obtain a handle a particular Job or Machine using each’s classes name property. All Jobs
must have a unique name, and all Machines must also have a unique name. findJob() returns both a Job and its parent
Machine as a JobMachineTuple
, a utility class container object that contains a Job and a Machine.
-
Methods that mutate Jobs:
-
startJob()
-
cancelJob()
-
restartJob()
-
The sequence diagram for these methods are very similar, they follow a similar pathway and mutate the same property in Job. We will therefore only detail the sequence diagram of startJob().
The following diagram shows the sequence diagram for startJob().
-
Methods that mutates the UniqueJobList within a Machine:
-
swapJobs()
-
moveJob()
-
shiftJob()
-
Much like before, the sequence diagram for these methods are very similar, but will call methods from the UniqueJobsList as well.
Therefore, we can use the manageJob command to manipulate the prints Jobs to achieve a representation of the actual prints in the makerspace. This can be illustrated in the simple activity Diagram below.
The following diagram shows the generic activity diagram for a managing a Job.
The generic flow of a typical manageJob command is as follows:
-
User enters a manageJob command
-
The method associated with its subcommand will be called.
-
Lookup methods findJob() / findMachine() will be called to obtain a handle on the target Job or Machine. If the these methods do not find the Job / Machine with the correct unique identifier (name), an Exception will be raised.
-
If the handles are found, then the appropriate action will be taken.
Design Considerations
Aspect: Direct Mutation of Objects (Jobs and Machines)
-
Alternative 1 (current choice): mutate object’s data fields directly.
-
Pros: No new objects have to be created, therefore saving unnecessary computations since only the required data fields are changed.
-
Cons: Objects are mutable. Additional care needs to be taken in ensuring that these objects are accessed defensively by methods that might cause unintended mutation. Additionally, mutation events must be flagged and raised, since they mutations within the Objects are not observed by its container.
-
-
Alternative 2: Create a new instance with edited fields
-
Pros: Defensive. Objects will never mutate, therefore there is no chance of unintended or illegal mutation. Changes observed by Observable Containers since a new object is created/added.
-
Cons: More computationally intensive, commands will take longer to execute. Also less room for extension since performance is now inversely proportional to object size.
-