Hack Notes CVA 091222

From Noisebridge
Revision as of 07:20, 17 April 2024 by 136.24.193.145 (talk)
Jump to navigation Jump to search

Hack Notes 2009-12-22

Belt?

V1.5 limit to just 8 motors for simplification purposes.

For a belt mod, reserve some V1.0 boards and instruct people to add diodes - deals with inventory problem.

NP V1.5

  • Settle on new parts

New parts for LiPo battery upgrade mod:

battery: sparkfun PRT-00341 charging IC: newark 59J2761 USB Mini B jack: digikey 670-1190-1-ND JST jack: digikey 455-1719-ND

  • Mounting acrylic - how many screws?
    • Make a mock-up
    • Border pieces - later cut tongue and grooves for snappage
      • Ask Rachel for feasability
    • Hold the boards in with notches (+$20 for more than 6pts board shape) = no holes!
  • No atmel socket - it's tall enough and people can figure that out
  • Investigated brownout detection, not useful

TODO / INVESTIGATE

  • Bigger cap to make the voltage drop less meaning the atmega won't reset when motors ramp up on low batteries
  • Switch to internal oscilator for simplicity and power saving, timing vars need retweaking???
  • Find/make through-hole usb mini eagle part

-- This module is a replacement for the RfX report bot.

local rfx = require( 'Module:Rfx' ) local colours = mw.loadData( 'Module:RFX report/colour' )

local p = {}

local function getTableLength(tbl) local length = 0 for _ in pairs(tbl) do length = length + 1 end return length end

local function getRfxes()

   -- Get the title object for Wikipedia:Requests for adminship.
   local noError, rfa = pcall( mw.title.new, 'Wikipedia:Requests for adminship' )
   if not noError or ( noError and not rfa ) then
       return nil
   end
   local rfaText = rfa:getContent()
   if not rfaText then
       return nil
   end
   
   -- Return a table with a list of pages transcluded from
   -- Wikipedia:Requests for adminship, minus the exceptions
   -- which are always transcluded there.
   local t = {}
   local exceptions = { 'Front matter', 'Header', 'bureaucratship' }
   for rfxPage, rfxSubpage in mw.ustring.gmatch( rfaText, '{{[ _]*([wW]ikipedia:[rR]equests for %w+/([^{}]-))[ _]*}}' ) do
       local isException = false
       for _, v in ipairs( exceptions ) do
           if rfxSubpage == v then
               isException = true
           end
       end
       if not isException then
           table.insert( t, rfxPage )
       end
   end
   return t

end

local function makeRow( rfxObject )

   if not ( type( rfxObject ) == 'table' and rfxObject.getTitleObject and rfxObject.getSupportUsers ) then
       return nil
   end
   local status = rfxObject:getStatus()
   local page = rfxObject:getTitleObject().prefixedText
   local user = rfxObject.user or rfxObject:getTitleObject().subpageText
   local supports = rfxObject.supports
   local opposes = rfxObject.opposes
   local neutrals = rfxObject.neutrals
   local percent = rfxObject.percent
   local colour
   if percent then
       colour = colours[ rfxObject.type ][ percent ]
   end
   colour = colour or 
   local votes
   if supports and opposes and neutrals and percent then
       votes = mw.ustring.format( [==[
       

| class="rfx-report-number" | %d | class="rfx-report-number" | %d | class="rfx-report-number" | %d | class="rfx-report-number rfx-report-percent" style="background: #%s;" | %d]==],

           page, supports,
           page, opposes,
           page, neutrals,
           colour, percent
       )
   else
       votes = '\n| colspan="4" class="rfx-report-error" | Error parsing votes'
   end
   if status then
       status = mw.language.getContentLanguage():ucfirst( status )
       if status == 'Pending closure' then
           status = 'Pending closure...'
       end
       status = '\n|' .. status
   else
       status = '\n| class="rfx-report-error" | Error getting status'
   end 
   local endTime = rfxObject.endTime
   local secondsLeft = rfxObject:getSecondsLeft()
   local timeLeft = rfxObject:getTimeLeft()
   local time
   if endTime and timeLeft then
       time = mw.ustring.format( '\n| %s\n| %s', endTime, timeLeft )
   else
       time = '\n| colspan="2" class="rfx-report-error" | Error parsing end time'
   end
   local dupes = rfxObject:dupesExist()
   if dupes then
       dupes = 'yes'
   elseif dupes == false then
       dupes = 'no'
   else
       dupes = '--'
   end
   local report = rfxObject:getReport()
   if report then
       report = mw.ustring.format( '\n| [%s report]', tostring( report ) )
   else
       report = '\n| class="rfx-report-error" | Report not found'
   end
   local pending_class = 
   if status == 'pending closure' then
       pending_class = 'class="rfx-report-pending"'
   end
   return mw.ustring.format(
       '\n|-%s\n| %s%s%s%s\n| class="rfx-report-dupes" | %s%s',
       pending_class, page, user, votes, status, time, dupes, report
   )

end

local function makeHeading( rfxType ) local frame = mw.getCurrentFrame()

   local rfxCaps
   if rfxType == 'rfa' then
       rfxCaps = 'RfA'
   elseif rfxType == 'rfb' then
       rfxCaps = 'RfB'
   else
       return nil
   end
   return mw.ustring.format(
       '\n|-\n! scope="col" | %s candidate !! scope="col" | S !! scope="col" | O !! scope="col" | N !! scope="col" | S %% !! scope="col" | Status !! scope="col" | Ending (UTC) !! scope="col" | Time left !! scope="col" | Dups? !! scope="col" | Report',
       rfxCaps
   )

end

local function getRfasRfbsSeparate() local rfxes = getRfxes()

   if not rfxes then
       return nil
   end
   -- Get RfX objects and separate RfAs and RfBs.
   local rfas = {}
   local rfbs = {}
   for i, rfxPage in ipairs( rfxes ) do
       local rfxObject = rfx.new( rfxPage )
       if rfxObject then
           if rfxObject.type == 'rfa' then
               table.insert( rfas, rfxObject )
           elseif rfxObject.type == 'rfb' then
               table.insert( rfbs, rfxObject )
           end
       end
   end
   
   return rfas, rfbs

end

local function makeReportRows() local rfas, rfbs = getRfasRfbsSeparate()

   local ret = {}
   if #rfas > 0 then
       table.insert( ret, makeHeading( 'rfa' ) )
       for i, rfaObject in ipairs( rfas ) do
           table.insert( ret, makeRow( rfaObject ) )
       end
   end
   if #rfbs > 0 then
       table.insert( ret, makeHeading( 'rfb' ) )
       for i, rfbObject in ipairs( rfbs ) do
           table.insert( ret, makeRow( rfbObject ) )
       end
   end
   return table.concat( ret )

end

local function makeReport( args )

   local purgeLink = mw.title.getCurrentTitle():fullUrl( 'action=purge' )
   local header = mw.ustring.format(
       '\n|+ Requests for adminship and bureaucratship [%s update]',
       purgeLink
   )
   local rows = makeReportRows() or 
   if rows ==  then
       rows = '\n|-\n| colspan="10" | No current discussions. Recent RfAs, recent RfBs: (successful, unsuccessful)'
   end
   
   local float = args.float or args.align
   if not float or mw.text.trim(float) ==  then
   	float = nil
   end
   local clear = args.clear
   if not clear or mw.text.trim(clear) ==  then
   	clear = nil
   end
   
   local style = 
   if float or clear then
   	style = string.format(
   		'style="%s%s"',
   		clear and ('clear: ' .. clear .. ';') or ,
   		float and ('float: ' .. float .. ';') or 
   	)
   end
   return mw.getCurrentFrame():extensionTag{

name = 'templatestyles', args = { src = 'Module:RFX report/styles.css' } } .. mw.ustring.format(

   	'\n{| class="wikitable rfx-report" %s%s%s\n|-\n|}',
   	style,
   	header,
   	rows
   )

end

function p.countRfas() local rfas, rfbs = getRfasRfbsSeparate() return getTableLength(rfas) end

function p.main( frame )

   -- Process the arguments.
   local args
   if frame == mw.getCurrentFrame() then
       args = frame:getParent().args
       for k, v in pairs( frame.args ) do
           args = frame.args
           break
       end
   else
       args = frame
   end    
   return makeReport( args )

end

return p


DONE

  • Add copyright info to code and old eagle files
  • Batt charging cap not spec'd yet, just copied the 0.1uF part
  • Put in RGB LED red=charging green=on