diff --git a/src/Robotics/Entities/WaterPump.ts b/src/Robotics/Entities/WaterPump.ts new file mode 100644 index 0000000..c4e627e --- /dev/null +++ b/src/Robotics/Entities/WaterPump.ts @@ -0,0 +1,13 @@ +import IWaterPump from '../Interfaces/IWaterPump' + +class WaterPump implements IWaterPump { + public pinOne: number + public pinTwo: number + + constructor (props: IWaterPump) { + this.pinOne = props.pinOne + this.pinTwo = props.pinTwo + } +} + +export default WaterPump diff --git a/src/Robotics/Entities/WaterPumper.ts b/src/Robotics/Entities/WaterPumper.ts new file mode 100644 index 0000000..55f5df7 --- /dev/null +++ b/src/Robotics/Entities/WaterPumper.ts @@ -0,0 +1,46 @@ +import IWaterPump from '../Interfaces/IWaterPump' +import * as childProcesses from 'child_process' +import IWaterPumperConstructor from '../Interfaces/IWaterPumperConstructor' +import IWaterPumper from '../Interfaces/IWaterPumper' +import makeWaterPump from '../UseCases/Factories/makeWaterPump' + +class WaterPumper implements IWaterPumper { + public waterPump: IWaterPump + public isActive: boolean = false + private pumpProcess: childProcesses.ChildProcessWithoutNullStreams | null = null + private pumpActiveTimeInSeconds: number + private pumpCoolDownTimeInSeconds: number + + constructor (props: IWaterPumperConstructor) { + this.waterPump = makeWaterPump({ + pinOne: props.pinOne, + pinTwo: props.pinTwo + }) + + this.pumpActiveTimeInSeconds =props.pumpActiveTimeInSeconds + this.pumpCoolDownTimeInSeconds = props.pumpCoolDownTimeInSeconds + } + + private async coolDown () { + return new Promise(resolve => setTimeout(resolve, this.pumpCoolDownTimeInSeconds * 1000)) + } + + public async pump () { + if (this.isActive) return + + const pumpProcessArguments = [ + 'src/Robotics/moveDcMotor.py', + this.waterPump.pinOne.toString(), + this.waterPump.pinTwo.toString(), + this.pumpActiveTimeInSeconds.toString() + ] + + this.pumpProcess = childProcesses.spawn('python', pumpProcessArguments) + + this.isActive = true + await this.coolDown() + this.isActive = false + } +} + +export default WaterPumper diff --git a/src/Robotics/Interfaces/IWaterPump.ts b/src/Robotics/Interfaces/IWaterPump.ts new file mode 100644 index 0000000..d37f1e3 --- /dev/null +++ b/src/Robotics/Interfaces/IWaterPump.ts @@ -0,0 +1,6 @@ +interface IWaterPump { + pinOne: number, + pinTwo: number +} + +export default IWaterPump diff --git a/src/Robotics/Interfaces/IWaterPumper.ts b/src/Robotics/Interfaces/IWaterPumper.ts new file mode 100644 index 0000000..b4ffcb5 --- /dev/null +++ b/src/Robotics/Interfaces/IWaterPumper.ts @@ -0,0 +1,9 @@ +import IWaterPump from "./IWaterPump"; + +interface IWaterPumper { + pump(): void + isActive: boolean + waterPump: IWaterPump +} + +export default IWaterPumper diff --git a/src/Robotics/Interfaces/IWaterPumperConstructor.ts b/src/Robotics/Interfaces/IWaterPumperConstructor.ts new file mode 100644 index 0000000..72c256e --- /dev/null +++ b/src/Robotics/Interfaces/IWaterPumperConstructor.ts @@ -0,0 +1,8 @@ +interface IWaterPumperConstructor { + pinOne: number, + pinTwo: number, + pumpActiveTimeInSeconds: number, + pumpCoolDownTimeInSeconds: number +} + +export default IWaterPumperConstructor diff --git a/src/Robotics/UseCases/Factories/makeWaterPump.ts b/src/Robotics/UseCases/Factories/makeWaterPump.ts new file mode 100644 index 0000000..a0c94e8 --- /dev/null +++ b/src/Robotics/UseCases/Factories/makeWaterPump.ts @@ -0,0 +1,8 @@ +import WaterPump from "../../Entities/WaterPump" +import IWaterPump from "../../Interfaces/IWaterPump" + +function makeWaterPump (props: IWaterPump) { + return new WaterPump(props) +} + +export default makeWaterPump diff --git a/src/Robotics/UseCases/Factories/makeWaterPumper.ts b/src/Robotics/UseCases/Factories/makeWaterPumper.ts new file mode 100644 index 0000000..63fab59 --- /dev/null +++ b/src/Robotics/UseCases/Factories/makeWaterPumper.ts @@ -0,0 +1,8 @@ +import WaterPumper from "../../Entities/WaterPumper" +import IWaterPumperConstructor from "../../Interfaces/IWaterPumperConstructor" + +function makeWaterPumper (props: IWaterPumperConstructor) { + return new WaterPumper(props) +} + +export default makeWaterPumper \ No newline at end of file diff --git a/src/Robotics/main.ts b/src/Robotics/main.ts index 2c1c95a..71223ac 100644 --- a/src/Robotics/main.ts +++ b/src/Robotics/main.ts @@ -1,12 +1,14 @@ import IEventManager from './Interfaces/IEventManager' import IMotorMover from './Interfaces/IMotorMover' +import IWaterPumper from './Interfaces/IWaterPumper' import makeServer from './UseCases/Factories/makeServer' import makeEventManager from './UseCases/Factories/makeEventManager' import makeMotorMover from './UseCases/Factories/makeMotorMover' +import makeWaterPumper from './UseCases/Factories/makeWaterPumper' const main = () => { - console.log('starting') + console.log('Starting Robotics') const port = 5005 makeServer(port) @@ -23,6 +25,13 @@ const main = () => { pauseIntervalTime: 0.05 }) + const waterPumper: IWaterPumper = makeWaterPumper({ + pinOne: 37, + pinTwo: 35, + pumpActiveTimeInSeconds: 1, + pumpCoolDownTimeInSeconds: 5 + }) + eventManager.listen('onReceiveOffsets', (offsets: any[]) => { if (offsets[0]?.x > 50) { xAxisMotorMover.moveCounterClockwise() @@ -39,7 +48,10 @@ const main = () => { } else { yAxisMotorMover.stopMovement() } - // console.log(`moving ${xAxisMotorMover.movementState}`) + + if (offsets[0]?.hypotenuse <= 80) { + waterPumper.pump() + } }) } diff --git a/src/Robotics/waterMotorTest.py b/src/Robotics/moveDcMotor.py similarity index 52% rename from src/Robotics/waterMotorTest.py rename to src/Robotics/moveDcMotor.py index fde25a0..9d17105 100644 --- a/src/Robotics/waterMotorTest.py +++ b/src/Robotics/moveDcMotor.py @@ -1,7 +1,15 @@ +# command arguments to run process +# 1: int pin_one +# 2: int pin_two +# 3: int motor_active_time + import RPi.GPIO as GPIO from time import sleep +import sys -motor_channel = (37, 35) +motor_channel = (int(sys.argv[1]), int(sys.argv[2])) # (37, 35) + +motor_active_time = int(sys.argv[3]) GPIO.setwarnings(True) GPIO.setmode(GPIO.BOARD) @@ -10,5 +18,5 @@ GPIO.setup(motor_channel, GPIO.OUT) GPIO.output(motor_channel, (GPIO.HIGH, GPIO.LOW)) print('Should be on') -sleep(1) +sleep(motor_active_time) GPIO.output(motor_channel, (GPIO.LOW, GPIO.LOW)) \ No newline at end of file