The Source engine is huge and complicated. You probably need to toy about with "Think" functions to get this to work, and set the next 'think time' for your weapon (offset from gpGlobals->curtime - which is the current game time)
This question is probably better directed at VERC Collective forums http://collective.valve-erc.com or Wavelength forums http://www.thewavelength.net
edit: here's some mock code - it's been a long time since I did anything with the Source engine. You really ought to ask on VERC for a better answer.
Code:
DEFINE_THINKFUNC(ShootWeaponThink);
DEFINE_THINKFUNC(ZoomSightThink);
DEFINE_THINKFUNC(IdleThink);
CMyWeapon::PrimaryAttack()
{
// Maybe some code here
pPlayer->SetFOV(0, 75f, 0.2f);
SetThink(&CMyWeapon::ShootWeaponThink);
SetNextThink( gpGlobals->curtime + 0.5 );
}
CMyWeapon::ShootWeaponThink()
{
// weapon firing code
SetThink(&CMyWeapon::IdleThink);
SetNextThink( gpGlobals->curtime + 0.05 );
}